AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Unit Class Referenceabstract

#include "Unit.h"

Inheritance diagram for Unit:
WorldObject Object WorldLocation Position Creature Player TempSummon anonymous_namespace{GmVisibleCommandTest.cpp}::TestPlayer Minion Guardian Puppet Totem Pet

Public Types

typedef std::unordered_set< Unit * > AttackerSet
 
typedef std::set< Unit * > ControlSet
 
typedef std::multimap< uint32, Aura * > AuraMap
 
typedef std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
 
typedef std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
 
typedef std::multimap< uint32, AuraApplication * > AuraApplicationMap
 
typedef std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
 
typedef std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
 
typedef std::multimap< AuraStateType, AuraApplication * > AuraStateAurasMap
 
typedef std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
 
typedef std::vector< AuraEffect * > AuraEffectList
 
typedef std::list< Aura * > AuraList
 
typedef std::list< AuraApplication * > AuraApplicationList
 
typedef std::list< DiminishingReturnDiminishing
 
typedef GuidUnorderedSet ComboPointHolderSet
 
typedef std::map< uint8, AuraApplication * > VisibleAuraMap
 
typedef std::set< PetAura const * > PetAuraSet
 

Public Member Functions

 ~Unit () override
 
void Update (uint32 time) override
 
UnitAIGetAI ()
 
void SetAI (UnitAI *newAI)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void CleanupBeforeRemoveFromMap (bool finalCleanup)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
virtual bool isBeingLoaded () const
 
bool IsDuringRemoveFromWorld () const
 
void SetUInt32Value (uint16 index, uint32 value)
 
UnitGetOwner () const
 
ObjectGuid GetOwnerGUID () const
 
void SetOwnerGUID (ObjectGuid owner)
 
ObjectGuid GetCreatorGUID () const
 
void SetCreatorGUID (ObjectGuid creator)
 
ObjectGuid GetMinionGUID () const
 
void SetMinionGUID (ObjectGuid guid)
 
ObjectGuid GetCharmerGUID () const
 
void SetCharmerGUID (ObjectGuid owner)
 
ObjectGuid GetCharmGUID () const
 
void SetPetGUID (ObjectGuid guid)
 
ObjectGuid GetPetGUID () const
 
void SetCritterGUID (ObjectGuid guid)
 
ObjectGuid GetCritterGUID () const
 
ObjectGuid GetTransGUID () const override
 
PetToPet ()
 
TotemToTotem ()
 
TempSummonToTempSummon ()
 
const TempSummonToTempSummon () const
 
void AddUnitState (uint32 f)
 
bool HasUnitState (const uint32 f) const
 
void ClearUnitState (uint32 f)
 
uint32 GetUnitState () const
 
uint32 HasUnitTypeMask (uint32 mask) const
 
void AddUnitTypeMask (uint32 mask)
 
uint32 GetUnitTypeMask () const
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h. More...
 
void RemoveUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h. More...
 
void ReplaceAllUnitFlags (UnitFlags flags)
 Remove the Unit flag specify only. More...
 
UnitFlags2 GetUnitFlags2 () const
 Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h. More...
 
bool HasUnitFlag2 (UnitFlags2 flags) const
 
void SetUnitFlag2 (UnitFlags2 flags)
 
void RemoveUnitFlag2 (UnitFlags2 flags)
 
void ReplaceAllUnitFlags2 (UnitFlags2 flags)
 
void SetEmoteState (Emote emoteState)
 
void ClearEmoteState ()
 Sets emote state (looping emote). Emotes available in SharedDefines.h. More...
 
NPCFlags GetNpcFlags () const
 Clears emote state (looping emote) More...
 
bool HasNpcFlag (NPCFlags flags) const
 
void SetNpcFlag (NPCFlags flags)
 
void RemoveNpcFlag (NPCFlags flags)
 
void ReplaceAllNpcFlags (NPCFlags flags)
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
void AddUnitMovementFlag (uint32 f)
 
void RemoveUnitMovementFlag (uint32 f)
 
bool HasUnitMovementFlag (uint32 f) const
 
uint32 GetUnitMovementFlags () const
 
void SetUnitMovementFlags (uint32 f)
 
void AddExtraUnitMovementFlag (uint16 f)
 
void RemoveExtraUnitMovementFlag (uint16 f)
 
uint16 HasExtraUnitMovementFlag (uint16 f) const
 
uint16 GetExtraUnitMovementFlags () const
 
void SetExtraUnitMovementFlags (uint16 f)
 
bool IsCrowdControlled () const
 
bool IsSummon () const
 
bool IsGuardian () const
 
bool IsControllableGuardian () const
 
bool IsPet () const
 
bool IsHunterPet () const
 
bool IsTotem () const
 
bool IsVehicle () const
 
bool IsVendor () const
 
bool IsTrainer () const
 
bool IsQuestGiver () const
 
bool IsGossip () const
 
bool IsTaxi () const
 
bool IsGuildMaster () const
 
bool IsBattleMaster () const
 
bool IsBanker () const
 
bool IsInnkeeper () const
 
bool IsSpiritHealer () const
 
bool IsSpiritGuide () const
 
bool IsTabardDesigner () const
 
bool IsAuctioner () const
 
bool IsArmorer () const
 
bool IsServiceProvider () const
 
bool IsSpiritService () const
 
uint32 GetCreatureType () const
 
uint32 GetCreatureTypeMask () const
 
bool IsCritter () const
 
uint8 getRace (bool original=false) const
 
void setRace (uint8 race)
 
uint32 getRaceMask () const
 
DisplayRace GetDisplayRaceFromModelId (uint32 modelId) const
 
DisplayRace GetDisplayRace () const
 
uint8 getClass () const
 
virtual bool IsClass (Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
 
uint32 getClassMask () const
 
uint8 getGender () const
 
uint32 GetFaction () const
 
FactionTemplateEntry const * GetFactionTemplateEntry () const
 
void SetFaction (uint32 faction)
 
void RestoreFaction ()
 
uint32 GetOldFactionId () const
 
ObjectGuid GetTarget () const
 
virtual void SetTarget (ObjectGuid=ObjectGuid::Empty)=0
 
bool isTargetableForAttack (bool checkFakeDeath=true, Unit const *byWho=nullptr) const
 
bool IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell=nullptr) const
 
bool _IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
 
bool IsValidAssistTarget (Unit const *target) const
 
bool _IsValidAssistTarget (Unit const *target, SpellInfo const *bySpell) const
 
float GetBoundaryRadius () const
 
float GetCombatReach () const override
 
float GetMeleeReach () const
 
bool IsWithinRange (Unit const *obj, float dist) const
 
bool IsWithinBoundaryRadius (const Unit *obj) const
 
bool IsWithinCombatRange (Unit const *obj, float dist2compare) const
 
bool IsWithinMeleeRange (Unit const *obj, float dist=0.f) const
 
float GetMeleeRange (Unit const *target) const
 
void setAttackTimer (WeaponAttackType type, int32 time)
 
void resetAttackTimer (WeaponAttackType type=BASE_ATTACK)
 
int32 getAttackTimer (WeaponAttackType type) const
 
bool isAttackReady (WeaponAttackType type=BASE_ATTACK) const
 
virtual SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
 
bool GetRandomContactPoint (Unit const *target, float &x, float &y, float &z, bool force=false) const
 
UnitgetAttackerForHelper () const
 
bool Attack (Unit *victim, bool meleeAttack)
 
void CastStop (uint32 except_spellid=0, bool withInstant=true)
 Interrupt the unit cast for all the current spells. More...
 
bool AttackStop ()
 Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client. More...
 
void RemoveAllAttackers ()
 Remove all units in m_attackers list and send them AttackStop() More...
 
AttackerSet const & getAttackers () const
 
bool GetMeleeAttackPoint (Unit *attacker, Position &pos)
 
bool isAttackingPlayer () const
 
UnitGetVictim () const
 
void CombatStop (bool includingCast=false)
 
void CombatStopWithPets (bool includingCast=false)
 
void StopAttackFaction (uint32 faction_id)
 
void StopAttackingInvalidTarget ()
 
UnitSelectNearbyTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
UnitSelectNearbyNoTotemTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
void SendMeleeAttackStop (Unit *victim=nullptr)
 Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead. More...
 
void SendMeleeAttackStart (Unit *victim, Player *sendTo=nullptr)
 
uint32 GetAttackTime (WeaponAttackType att) const
 
void SetAttackTime (WeaponAttackType att, uint32 val)
 
void ApplyAttackTimePercentMod (WeaponAttackType att, float val, bool apply)
 
void ApplyCastTimePercentMod (float val, bool apply)
 
void SetImmuneToAll (bool apply, bool keepCombat=false)
 
bool IsImmuneToAll () const
 
void SetImmuneToPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToPC () const
 
void SetImmuneToNPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToNPC () const
 
bool IsEngaged () const
 
bool IsEngagedBy (Unit const *who) const
 
bool IsInCombat () const
 
bool IsInCombatWith (Unit const *who) const
 
bool IsPetInCombat () const
 
void CombatStart (Unit *target, bool initialAggro=true)
 
void CombatStartOnCast (Unit *target, bool initialAggro=true, uint32 duration=0)
 
void SetInCombatState (bool PvP, Unit *enemy=nullptr, uint32 duration=0)
 
void SetInCombatWith (Unit *enemy, uint32 duration=0)
 
void ClearInCombat ()
 
void ClearInPetCombat ()
 
uint32 GetCombatTimer () const
 
void SetCombatTimer (uint32 timer)
 
bool CanHaveThreatList (bool skipAliveCheck=false) const
 
void AddThreat (Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
 
float ApplyTotalThreatModifier (float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
void TauntApply (Unit *victim)
 
void TauntFadeOut (Unit *taunter)
 
ThreatMgrGetThreatMgr ()
 
ThreatMgr const & GetThreatMgr () const
 
void addHatedBy (HostileReference *pHostileReference)
 
void removeHatedBy (HostileReference *)
 
HostileRefMgrgetHostileRefMgr ()
 
void SetRedirectThreat (ObjectGuid guid, uint32 pct)
 
void ResetRedirectThreat ()
 
void ModifyRedirectThreat (int32 amount)
 
uint32 GetRedirectThreatPercent ()
 
UnitGetRedirectThreatTarget () const
 
void SetLastDamagedTargetGuid (ObjectGuid const &guid)
 
ObjectGuid const & GetLastDamagedTargetGuid () const
 
void AttackerStateUpdate (Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
 
bool haveOffhandWeapon () const
 
bool CanDualWield () const
 
virtual void SetCanDualWield (bool value)
 
virtual bool HasWeapon (WeaponAttackType type) const =0
 
bool HasMainhandWeapon () const
 
bool HasOffhandWeapon () const
 
bool HasRangedWeapon () const
 
bool hasMainhandWeaponForAttack () const
 
virtual bool HasWeaponForAttack (WeaponAttackType type) const
 
bool HasMainhandWeaponForAttack () const
 
bool HasOffhandWeaponForAttack () const
 
bool HasRangedWeaponForAttack () const
 
bool CanUseAttackType (uint8 attacktype) const
 
void HandleProcExtraAttackFor (Unit *victim, uint32 count)
 
void SetLastExtraAttackSpell (uint32 spellId)
 
uint32 GetLastExtraAttackSpell () const
 
void AddExtraAttacks (uint32 count)
 
uint8 GetComboPoints (Unit const *who=nullptr) const
 
uint8 GetComboPoints (ObjectGuid const &guid) const
 
UnitGetComboTarget () const
 
ObjectGuid const GetComboTargetGUID () const
 
void AddComboPoints (Unit *target, int8 count)
 
void AddComboPoints (int8 count)
 
void ClearComboPoints ()
 
void AddComboPointHolder (Unit *unit)
 
void RemoveComboPointHolder (Unit *unit)
 
void ClearComboPointHolders ()
 
void SetContestedPvP (Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
 
bool IsContestedGuard () const
 
bool RespondsToCallForHelp () const
 
bool IsInSanctuary () const
 
bool IsPvP () const
 
bool IsFFAPvP () const
 
void SetPvP (bool state)
 
float GetStat (Stats stat) const
 
void SetStat (Stats stat, int32 val)
 
Stats GetStatByAuraGroup (UnitMods unitMod) const
 
float GetCreateStat (Stats stat) const
 
void SetCreateStat (Stats stat, float val)
 
float GetPosStat (Stats stat) const
 
float GetNegStat (Stats stat) const
 
void InitStatBuffMods ()
 
bool HandleStatModifier (UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
 
void SetModifierValue (UnitMods unitMod, UnitModifierType modifierType, float value)
 
float GetModifierValue (UnitMods unitMod, UnitModifierType modifierType) const
 
float GetTotalStatValue (Stats stat, float additionalValue=0.0f) const
 
void SetCanModifyStats (bool modifyStats)
 
bool CanModifyStats () const
 
void ApplyStatBuffMod (Stats stat, float val, bool apply)
 
void ApplyStatPercentBuffMod (Stats stat, float val, bool apply)
 
uint8 GetLevel () const
 
uint8 getLevelForTarget (WorldObject const *) const override
 
void SetLevel (uint8 lvl, bool showLevelChange=true)
 
uint32 GetHealth () const
 
uint32 GetMaxHealth () const
 
float GetHealthPct () const
 
int32 GetHealthGain (int32 dVal)
 
uint32 GetCreateHealth () const
 
bool IsFullHealth () const
 
bool HealthBelowPct (int32 pct) const
 
bool HealthBelowPctDamaged (int32 pct, uint32 damage) const
 
bool HealthAbovePct (int32 pct) const
 
bool HealthAbovePctHealed (int32 pct, uint32 heal) const
 
uint32 CountPctFromMaxHealth (int32 pct) const
 
uint32 CountPctFromCurHealth (int32 pct) const
 
void SetHealth (uint32 val)
 
void SetMaxHealth (uint32 val)
 
void SetFullHealth ()
 
int32 ModifyHealth (int32 val)
 
void SetCreateHealth (uint32 val)
 
Powers getPowerType () const
 
virtual bool HasActivePowerType (Powers power)
 
Powers GetPowerTypeByAuraGroup (UnitMods unitMod) const
 
uint32 GetPower (Powers power) const
 
uint32 GetMaxPower (Powers power) const
 
float GetPowerPct (Powers power) const
 
uint32 GetCreatePowers (Powers power) const
 
void setPowerType (Powers power)
 
void SetPower (Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
 
void SetMaxPower (Powers power, uint32 val)
 
int32 ModifyPower (Powers power, int32 val, bool withPowerUpdate=true)
 
int32 ModifyPowerPct (Powers power, float pct, bool apply=true)
 
void RewardRage (uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
 
uint32 GetCreateMana () const
 
void SetCreateMana (uint32 val)
 
bool CanRestoreMana (SpellInfo const *spellInfo) const
 
void SetLastManaUse (uint32 spellCastTime)
 
bool IsUnderLastManaUseEffect () const
 
float GetAPMultiplier (WeaponAttackType attType, bool normalized)
 
uint32 GetArmor () const
 
void SetArmor (int32 val)
 
float GetUnitDodgeChance () const
 
float GetUnitParryChance () const
 
float GetUnitBlockChance () const
 
float GetUnitMissChance (WeaponAttackType attType) const
 
float GetUnitCriticalChance (WeaponAttackType attackType, Unit const *victim) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
 
bool CanApplyResilience () const
 
virtual uint32 GetShieldBlockValue () const =0
 
uint32 GetShieldBlockValue (uint32 soft_cap, uint32 hard_cap) const
 
uint32 GetUnitMeleeSkill (Unit const *target=nullptr) const
 
uint32 GetDefenseSkillValue (Unit const *target=nullptr) const
 
uint32 GetWeaponSkillValue (WeaponAttackType attType, Unit const *target=nullptr) const
 
int32 GetMechanicResistChance (SpellInfo const *spell)
 
uint32 GetResistance (SpellSchoolMask mask) const
 
uint32 GetResistance (SpellSchools school) const
 
float GetResistanceBuffMods (SpellSchools school, bool positive) const
 
void SetResistance (SpellSchools school, int32 val)
 
void SetResistanceBuffMods (SpellSchools school, bool positive, float val)
 
void ApplyResistanceBuffModsMod (SpellSchools school, bool positive, float val, bool apply)
 
void ApplyResistanceBuffModsPercentMod (SpellSchools school, bool positive, float val, bool apply)
 
uint16 GetMaxSkillValueForLevel (Unit const *target=nullptr) const
 
float GetTotalAuraModValue (UnitMods unitMod) const
 
SpellSchools GetSpellSchoolByAuraGroup (UnitMods unitMod) const
 
float GetTotalAttackPowerValue (WeaponAttackType attType, Unit *pVictim=nullptr) const
 
float GetWeaponDamageRange (WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
 
void SetBaseWeaponDamage (WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
 
virtual bool UpdateStats (Stats stat)=0
 
virtual bool UpdateAllStats ()=0
 
virtual void UpdateResistances (uint32 school)=0
 
virtual void UpdateAllResistances ()
 
virtual void UpdateArmor ()=0
 
virtual void UpdateMaxHealth ()=0
 
virtual void UpdateMaxPower (Powers power)=0
 
virtual void UpdateAttackPowerAndDamage (bool ranged=false)=0
 
virtual void UpdateDamagePhysical (WeaponAttackType attType)
 
void DealMeleeDamage (CalcDamageInfo *damageInfo, bool durabilityLoss)
 
void DealSpellDamage (SpellNonMeleeDamage *damageInfo, bool durabilityLoss, Spell const *spell=nullptr)
 
void KillSelf (bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
uint32 CalculateDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
 
virtual void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0
 
void CalculateMeleeDamage (Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
 
void CalculateSpellDamageTaken (SpellNonMeleeDamage *damageInfo, int32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=BASE_ATTACK, bool crit=false)
 
int32 CalculateSpellDamage (Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
 
float CalculateDefaultCoefficient (SpellInfo const *spellInfo, DamageEffectType damagetype) const
 
uint32 MeleeDamageBonusDone (Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
uint32 MeleeDamageBonusTaken (Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
int32 SpellBaseDamageBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseDamageBonusTaken (SpellSchoolMask schoolMask, bool isDoT=false)
 
float SpellPctDamageModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellDamageBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellDamageBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
 
int32 CalculateAOEDamageReduction (int32 damage, uint32 schoolMask, bool npcCaster) const
 
uint32 GetMeleeDamageReduction (uint32 damage) const
 
uint32 GetRangedDamageReduction (uint32 damage) const
 
uint32 GetSpellDamageReduction (uint32 damage) const
 
float GetMeleeCritChanceReduction () const
 
float GetRangedCritChanceReduction () const
 
float GetSpellCritChanceReduction () const
 
uint32 GetMeleeCritDamageReduction (uint32 damage) const
 
uint32 GetRangedCritDamageReduction (uint32 damage) const
 
uint32 GetSpellCritDamageReduction (uint32 damage) const
 
CharmInfoGetCharmInfo ()
 
CharmInfoInitCharmInfo ()
 
UnitGetCharmer () const
 
UnitGetCharm () const
 
UnitGetCharmerOrOwner () const
 
UnitGetCharmerOrOwnerOrSelf () const
 
PlayerGetCharmerOrOwnerPlayerOrPlayerItself () const
 
ObjectGuid GetCharmerOrOwnerGUID () const
 
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const
 
PlayerGetAffectingPlayer () const
 
UnitGetFirstControlled () const
 
bool IsControlledByPlayer () const
 
bool IsCreatedByPlayer () const
 
bool IsCharmedOwnedByPlayerOrPlayer () const
 
bool IsCharmed () const
 
bool isPossessed () const
 
bool isPossessedByPlayer () const
 
bool isPossessing () const
 
bool isPossessing (Unit *u) const
 
void SetCharm (Unit *target, bool apply)
 
bool SetCharmedBy (Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
 
void UpdateCharmAI ()
 
void RemoveCharmedBy (Unit *charmer)
 
void RemoveCharmAuras ()
 
void RemoveAllControlled (bool onDeath=false)
 
void DeleteCharmInfo ()
 
virtual bool HasSpellCooldown (uint32) const
 
virtual bool HasSpellItemCooldown (uint32, uint32) const
 
virtual void AddSpellCooldown (uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, PacketCooldowns const &cooldowns)
 
AuraAddAura (uint32 spellId, Unit *target)
 
AuraAddAura (SpellInfo const *spellInfo, uint8 effMask, Unit *target)
 
void SetAuraStack (uint32 spellId, Unit *target, uint32 stack)
 
Aura_TryStackingOrRefreshingExistingAura (SpellInfo const *newAura, uint8 effMask, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool periodicReset=false)
 
void _AddAura (UnitAura *aura, Unit *caster)
 
AuraApplication_CreateAuraApplication (Aura *aura, uint8 effMask)
 
void _ApplyAuraEffect (Aura *aura, uint8 effIndex)
 
void _ApplyAura (AuraApplication *aurApp, uint8 effMask)
 
void _UnapplyAura (AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
 
void _UnapplyAura (AuraApplication *aurApp, AuraRemoveMode removeMode)
 
void _RemoveNoStackAuraApplicationsDueToAura (Aura *aura)
 
void _RemoveNoStackAurasDueToAura (Aura *aura)
 
bool _IsNoStackAuraDueToAura (Aura *appliedAura, Aura *existingAura) const
 
void _RegisterAuraEffect (AuraEffect *aurEff, bool apply)
 
AuraMapGetOwnedAuras ()
 
AuraMap const & GetOwnedAuras () const
 
void RemoveOwnedAura (AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (Aura *aura, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
AuraGetOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
 
AuraApplicationMapGetAppliedAuras ()
 
AuraApplicationMap const & GetAppliedAuras () const
 
void RemoveAura (AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (AuraApplication *aurApp, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (Aura *aur, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveBindSightAuras ()
 
void RemoveAppliedAuras (std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (std::function< bool(Aura const *)> const &check)
 
void RemoveAppliedAuras (uint32 spellId, std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (uint32 spellId, std::function< bool(Aura const *)> const &check)
 
void RemoveAurasDueToSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAuraFromStack (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAurasDueToSpellByDispel (uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit *dispeller, uint8 chargesRemoved=1)
 
void RemoveAurasDueToSpellBySteal (uint32 spellId, ObjectGuid casterGUID, Unit *stealer)
 
void RemoveAurasDueToItemSpell (uint32 spellId, ObjectGuid castItemGuid)
 
void RemoveAurasByType (AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
 
void RemoveNotOwnSingleTargetAuras ()
 
void RemoveAurasWithInterruptFlags (uint32 flag, uint32 except=0, bool isAutoshot=false)
 
void RemoveAurasWithAttribute (uint32 flags)
 
void RemoveAurasWithFamily (SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID)
 
void RemoveAurasWithMechanic (uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
 
void RemoveMovementImpairingAuras (bool withRoot)
 
void RemoveAurasByShapeShift ()
 
void RemoveAreaAurasDueToLeaveWorld ()
 
void RemoveAllAuras ()
 
void RemoveArenaAuras ()
 
void RemoveAllAurasOnDeath ()
 
void RemoveAllAurasRequiringDeadTarget ()
 
void RemoveAllAurasExceptType (AuraType type)
 
void RemoveEvadeAuras ()
 
void DelayOwnedAuras (uint32 spellId, ObjectGuid caster, int32 delaytime)
 
void _RemoveAllAuraStatMods ()
 
void _ApplyAllAuraStatMods ()
 
AuraEffectList const & GetAuraEffectsByType (AuraType type) const
 
AuraListGetSingleCastAuras ()
 
AuraList const & GetSingleCastAuras () const
 
AuraEffectGetAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectOfRankedSpell (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectDummy (uint32 spellid) const
 
AuraEffectGetDummyAuraEffect (SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraApplicationGetAuraApplication (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
AuraApplicationGetAuraApplicationOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAuraOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
void GetDispellableAuraList (Unit *caster, uint32 dispelMask, DispelChargesList &dispelList, SpellInfo const *dispelSpell)
 
bool HasAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
 
uint32 GetAuraCount (uint32 spellId) const
 
bool HasAuras (SearchMethod sm, std::vector< uint32 > &spellIds) const
 Check if unit has ANY or ALL specified auras. More...
 
template<typename... Auras>
bool HasAnyAuras (Auras... spellIds) const
 Checks if the unit has ANY specified auras. More...
 
template<typename... Auras>
bool HasAllAuras (Auras... spellIds) const
 Checks if the unit has ALL specified auras. More...
 
bool HasAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
bool HasAuraType (AuraType auraType) const
 
bool HasAuraTypeWithCaster (AuraType auratype, ObjectGuid caster) const
 
bool HasAuraTypeWithMiscvalue (AuraType auratype, int32 miscvalue) const
 
bool HasAuraTypeWithAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
bool HasAuraTypeWithValue (AuraType auratype, int32 value) const
 
bool HasAuraTypeWithTriggerSpell (AuraType auratype, uint32 triggerSpell) const
 
bool HasNegativeAuraWithInterruptFlag (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasVisibleAuraType (AuraType auraType) const
 
bool HasNegativeAuraWithAttribute (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasAuraWithMechanic (uint32 mechanicMask) const
 
bool HasAuraTypeWithFamilyFlags (AuraType auraType, uint32 familyName, uint32 familyFlags) const
 
bool HasBreakableByDamageAuraType (AuraType type, uint32 excludeAura=0) const
 
bool HasBreakableByDamageCrowdControlAura (Unit *excludeCasterChannel=nullptr) const
 
AuraEffectIsScriptOverriden (SpellInfo const *spell, int32 script) const
 
uint32 GetDiseasesByCaster (ObjectGuid casterGUID, uint8 mode=0)
 
uint32 GetDoTsByCaster (ObjectGuid casterGUID) const
 
int32 GetTotalAuraModifierAreaExclusive (AuraType auratype) const
 
int32 GetTotalAuraModifier (AuraType auratype) const
 
float GetTotalAuraMultiplier (AuraType auratype) const
 
int32 GetMaxPositiveAuraModifier (AuraType auratype)
 
int32 GetMaxNegativeAuraModifier (AuraType auratype) const
 
int32 GetTotalAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
float GetTotalAuraMultiplierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetMaxPositiveAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
 
int32 GetMaxNegativeAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetTotalAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
float GetTotalAuraMultiplierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxPositiveAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxNegativeAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetTotalAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetTotalAuraMultiplierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxPositiveAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxNegativeAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
VisibleAuraMap const * GetVisibleAuras ()
 
AuraApplicationGetVisibleAura (uint8 slot)
 
void SetVisibleAura (uint8 slot, AuraApplication *aur)
 
void RemoveVisibleAura (uint8 slot)
 
void ModifyAuraState (AuraStateType flag, bool apply)
 
uint32 BuildAuraStateUpdateForTarget (Unit *target) const
 
bool HasAuraState (AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
 
bool CanProc ()
 
void SetCantProc (bool apply)
 
void ProcDamageAndSpellFor (bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
void GetProcAurasTriggeredOnEvent (std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
 
void TriggerAurasProcOnEvent (CalcDamageInfo &damageInfo)
 
void TriggerAurasProcOnEvent (std::list< AuraApplication * > *myProcAuras, std::list< AuraApplication * > *targetProcAuras, Unit *actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
 
void TriggerAurasProcOnEvent (ProcEventInfo &eventInfo, std::list< AuraApplication * > &procAuras)
 
float GetWeaponProcChance () const
 
float GetPPMProcChance (uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
 
PlayerGetSpellModOwner () const
 
SpellGetCurrentSpell (CurrentSpellTypes spellType) const
 
SpellGetCurrentSpell (uint32 spellType) const
 
SpellGetFirstCurrentCastingSpell () const
 
SpellFindCurrentSpellBySpellId (uint32 spell_id) const
 
int32 GetCurrentSpellCastTime (uint32 spell_id) const
 
virtual bool HasSpell (uint32) const
 
void SetCurrentCastedSpell (Spell *pSpell)
 
virtual void ProhibitSpellSchool (SpellSchoolMask, uint32)
 
void SetInstantCast (bool set)
 
bool CanInstantCast () const
 
bool IsNonMeleeSpellCast (bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
 
void InterruptNonMeleeSpells (bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
 
float GetSpellMaxRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
float GetSpellMinRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
uint32 GetInterruptMask () const
 
void AddInterruptMask (uint32 mask)
 
void UpdateInterruptMask ()
 
void InterruptSpell (CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
 
bool isSpellBlocked (Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
 
void FinishSpell (CurrentSpellTypes spellType, bool ok=true)
 
UnitGetMagicHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo)
 
UnitGetMeleeHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo=nullptr)
 
float MeleeSpellMissChance (Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
 
SpellMissInfo MeleeSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo MagicSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo SpellHitResult (Unit *victim, SpellInfo const *spell, bool canReflect=false)
 
SpellMissInfo SpellHitResult (Unit *victim, Spell const *spell, bool canReflect=false)
 
void SendHealSpellLog (HealInfo const &healInfo, bool critical=false)
 
int32 HealBySpell (HealInfo &healInfo, bool critical=false)
 
int32 SpellBaseHealingBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseHealingBonusTaken (SpellSchoolMask schoolMask)
 
float SpellPctHealingModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellHealingBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellHealingBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1)
 
void SendEnergizeSpellLog (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void EnergizeBySpell (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void ApplySpellImmune (uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
 
void ApplySpellDispelImmunity (SpellInfo const *spellProto, DispelType type, bool apply)
 
virtual bool IsImmunedToSpell (SpellInfo const *spellInfo, Spell const *spell=nullptr)
 
bool IsImmunedToDamage (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamage (SpellInfo const *spellInfo) const
 
bool IsImmunedToDamage (Spell const *spell) const
 
bool IsImmunedToSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToSchool (SpellInfo const *spellInfo) const
 
bool IsImmunedToSchool (Spell const *spell) const
 
bool IsImmunedToDamageOrSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamageOrSchool (SpellInfo const *spellInfo) const
 
virtual bool IsImmunedToSpellEffect (SpellInfo const *spellInfo, uint32 index) const
 
bool isBlockCritical ()
 
float SpellDoneCritChance (Unit const *, SpellInfo const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const
 
float SpellTakenCritChance (Unit const *caster, SpellInfo const *spellProto, SpellSchoolMask schoolMask, float doneChance, WeaponAttackType attackType, bool skipEffectCheck) const
 
float ApplyEffectModifiers (SpellInfo const *spellProto, uint8 effect_index, float value) const
 
int32 CalcSpellDuration (SpellInfo const *spellProto)
 
int32 ModSpellDuration (SpellInfo const *spellProto, Unit const *target, int32 duration, bool positive, uint32 effectMask)
 
void ModSpellCastTime (SpellInfo const *spellProto, int32 &castTime, Spell *spell=nullptr)
 
float CalculateLevelPenalty (SpellInfo const *spellProto) const
 
uint32 GetCastingTimeForBonus (SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
 
void CastDelayedSpellWithPeriodicAmount (Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
 
SpellCastResult CastSpell (SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (float x, float y, float z, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (GameObject *go, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (SpellInfo const *spellInfo, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
void _RegisterDynObject (DynamicObject *dynObj)
 
void _UnregisterDynObject (DynamicObject *dynObj)
 
DynamicObjectGetDynObject (uint32 spellId)
 
bool RemoveDynObject (uint32 spellId)
 
void RemoveAllDynObjects ()
 
GameObjectGetGameObject (uint32 spellId) const
 
void AddGameObject (GameObject *gameObj)
 
void RemoveGameObject (GameObject *gameObj, bool del)
 
void RemoveGameObject (uint32 spellid, bool del)
 
void RemoveAllGameObjects ()
 
bool IsPolymorphed () const
 
bool isFrozen () const
 
bool IsInFlight () const
 
bool IsLevitating () const
 
bool IsWalking () const
 
bool isMoving () const
 
bool isTurning () const
 
bool IsHovering () const
 
bool isSwimming () const
 
virtual bool CanFly () const =0
 
bool IsFlying () const
 
bool IsFalling () const
 
float GetHoverHeight () const
 
virtual bool IsMovementPreventedByCasting () const
 
virtual bool CanEnterWater () const =0
 
virtual bool CanSwim () const
 this method checks the current flag of a unit More...
 
bool CanFreeMove () const
 
bool HasLeewayMovement () const
 
void KnockbackFrom (float x, float y, float speedXY, float speedZ)
 
void JumpTo (float speedXY, float speedZ, bool forward=true)
 
void JumpTo (WorldObject *obj, float speedZ)
 
void UpdateSpeed (UnitMoveType mtype, bool forced)
 
float GetSpeed (UnitMoveType mtype) const
 
float GetSpeedRate (UnitMoveType mtype) const
 
void SetSpeed (UnitMoveType mtype, float rate, bool forced=false)
 
void SetSpeedRate (UnitMoveType mtype, float rate)
 
void propagateSpeedChange ()
 
void SendMonsterMove (float NewPosX, float NewPosY, float NewPosZ, uint32 TransitTime, SplineFlags sf=SPLINEFLAG_WALK_MODE)
 
void MonsterMoveWithSpeed (float x, float y, float z, float speed)
 
virtual bool SetWalk (bool enable)
 
virtual bool SetDisableGravity (bool disable, bool packetOnly=false, bool updateAnimationTier=true)
 
virtual bool SetSwim (bool enable)
 
virtual bool SetCanFly (bool enable, bool packetOnly=false)
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity(). More...
 
virtual bool SetWaterWalking (bool enable, bool packetOnly=false)
 Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players. More...
 
virtual bool SetFeatherFall (bool enable, bool packetOnly=false)
 
virtual bool SetHover (bool enable, bool packetOnly=false, bool updateAnimationTier=true)
 
MotionMasterGetMotionMaster ()
 
const MotionMasterGetMotionMaster () const
 
virtual MovementGeneratorType GetDefaultMovementType () const
 -------—End of Pet responses methods-------— More...
 
bool IsStopped () const
 
void StopMoving ()
 
void StopMovingOnCurrentPos ()
 
virtual void PauseMovement (uint32 timer=0, uint8 slot=0)
 Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline. More...
 
void ResumeMovement (uint32 timer=0, uint8 slot=0)
 
void SetControlled (bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
 
void DisableRotate (bool apply)
 
void DisableSpline ()
 
SheathState GetSheath () const
 
virtual void SetSheath (SheathState sheathed)
 
uint8 getStandState () const
 
bool IsSitState () const
 
bool IsStandState () const
 
void SetStandState (uint8 state)
 
void SetStandFlags (uint8 flags)
 
void RemoveStandFlags (uint8 flags)
 
DeathState getDeathState ()
 
virtual void setDeathState (DeathState s, bool despawn=false)
 
bool IsAlive () const
 
bool isDying () const
 
bool isDead () const
 
bool HasGhostAura () const
 
bool HasMountedAura () const
 
bool HasWaterWalkAura () const
 
bool HasFeatherFallAura () const
 
bool HasHoverAura () const
 
bool HasFlyAura () const
 
bool HasSpiritOfRedemptionAura () const
 
bool HasPreventsFleeingAura () const
 
bool HasPreventDurabilityLossAura () const
 
bool HasPreventResurectionAura () const
 
bool HasTransformAura () const
 
bool HasInterruptRegenAura () const
 
bool HasNoPVPCreditAura () const
 
bool HasWaterBreathingAura () const
 
bool HasIgnoreHitDirectionAura () const
 
bool HasSpellMagnetAura () const
 
bool HasOpenStableAura () const
 
bool HasCloneCasterAura () const
 
bool HasReflectSpellsAura () const
 
bool HasDetectAmoreAura () const
 
bool HasAllowOnlyAbilityAura () const
 
bool HasPeriodicDummyAura () const
 
bool HasControlVehicleAura () const
 
bool HasAOECharmAura () const
 
bool HasDetectSpellsAura () const
 
bool HasPacifySilenceAura () const
 
bool HasSilenceAura () const
 
bool HasShapeshiftAura () const
 
bool HasDecreaseSpeedAura () const
 
bool HasPacifyAura () const
 
bool HasIgnoreTargetResistAura () const
 
bool HasIncreaseMountedSpeedAura () const
 
bool HasIncreaseMountedFlightSpeedAura () const
 
bool HasThreatAura () const
 
bool HasAttackerSpellCritChanceAura () const
 
bool HasUnattackableAura () const
 
bool HasHealthRegenInCombatAura () const
 
bool HasRegenDuringCombatAura () const
 
bool HasFearAura () const
 
bool HasConfuseAura () const
 
bool HasRootAura () const
 
bool HasStunAura () const
 
bool HasTauntAura () const
 
bool HasStealthAura () const
 
bool HasStealthDetectAura () const
 
bool HasInvisibilityAura () const
 
bool HasInvisibilityDetectAura () const
 
bool IsHostileTo (Unit const *unit) const
 
bool IsHostileToPlayers () const
 
bool IsFriendlyTo (Unit const *unit) const
 
bool IsNeutralToAll () const
 
void ClearAllReactives ()
 
void StartReactiveTimer (ReactiveType reactive)
 
void UpdateReactives (uint32 p_time)
 
DiminishingLevels GetDiminishing (DiminishingGroup group)
 
void IncrDiminishing (DiminishingGroup group)
 
float ApplyDiminishingToDuration (DiminishingGroup group, int32 &duration, Unit *caster, DiminishingLevels Level, int32 limitduration)
 
void ApplyDiminishingAura (DiminishingGroup group, bool apply)
 
void ClearDiminishings ()
 
bool IsInPartyWith (Unit const *unit) const
 
bool IsInRaidWith (Unit const *unit) const
 
void GetPartyMembers (std::list< Unit * > &units)
 
UnitGetNextRandomRaidMemberOrPet (float radius)
 
void UpdateAuraForGroup (uint8 slot)
 
ReputationRank GetReactionTo (Unit const *target, bool checkOriginalFaction=false) const
 
ReputationRank GetFactionReactionTo (FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
 
SharedVisionList const & GetSharedVisionList ()
 
void AddPlayerToVision (Player *player)
 
void RemovePlayerFromVision (Player *player)
 
bool HasSharedVision () const
 
uint32 GetVirtualItemId (uint32 slot) const
 
void SetVirtualItem (uint32 slot, uint32 itemId)
 
bool IsMounted () const
 
uint32 GetMountID () const
 
void Mount (uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
 
void Dismount ()
 
bool IsInDisallowedMountForm () const
 
void addFollower (FollowerReference *pRef)
 
void removeFollower (FollowerReference *)
 
virtual float GetFollowAngle () const
 
GuardianGetGuardianPet () const
 
MinionGetFirstMinion () const
 
CreatureGetCompanionPet () const
 
PetCreateTamedPetFrom (Creature *creatureTarget, uint32 spell_id=0)
 
PetCreateTamedPetFrom (uint32 creatureEntry, uint32 spell_id=0)
 
bool InitTamedPet (Pet *pet, uint8 level, uint32 spell_id)
 
void SetMinion (Minion *minion, bool apply)
 
void GetAllMinionsByEntry (std::list< Creature * > &Minions, uint32 entry)
 
void RemoveAllMinionsByEntry (uint32 entry)
 
void AddPetAura (PetAura const *petSpell)
 
void RemovePetAura (PetAura const *petSpell)
 
void CastPetAura (PetAura const *aura)
 
bool IsPetAura (Aura const *aura)
 
void PetSpellFail (SpellInfo const *spellInfo, Unit *target, uint32 result)
 
void UnsummonAllTotems (bool onDeath=false)
 
TransportBaseGetDirectTransport () const
 
bool CreateVehicleKit (uint32 id, uint32 creatureEntry)
 Returns the transport this unit is on directly (if on vehicle and transport, return vehicle) More...
 
void RemoveVehicleKit ()
 
VehicleGetVehicleKit () const
 
VehicleGetVehicle () const
 
bool IsOnVehicle (Unit const *vehicle) const
 
UnitGetVehicleBase () const
 
CreatureGetVehicleCreatureBase () const
 
void EnterVehicle (Unit *base, int8 seatId=-1)
 
void EnterVehicleUnattackable (Unit *base, int8 seatId=-1)
 
void ExitVehicle (Position const *exitPosition=nullptr)
 
void ChangeSeat (int8 seatId, bool next=true)
 
bool HandleSpellClick (Unit *clicker, int8 seatId=-1)
 
void _ExitVehicle (Position const *exitPosition=nullptr)
 
void _EnterVehicle (Vehicle *vehicle, int8 seatId, AuraApplication const *aurApp=nullptr)
 
void HandleEmoteCommand (uint32 emoteId)
 
virtual void Talk (std::string_view text, ChatMsg msgType, Language language, float textRange, WorldObject const *target)
 
virtual void Say (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void Yell (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void TextEmote (std::string_view text, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (std::string_view text, Language language, Player *target, bool isBossWhisper=false)
 
virtual void Talk (uint32 textId, ChatMsg msgType, float textRange, WorldObject const *target)
 
virtual void Say (uint32 textId, WorldObject const *target=nullptr)
 
virtual void Yell (uint32 textId, WorldObject const *target=nullptr)
 
virtual void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (uint32 textId, Player *target, bool isBossWhisper=false)
 
ShapeshiftForm GetShapeshiftForm () const
 
void SetShapeshiftForm (ShapeshiftForm form)
 
bool IsAttackSpeedOverridenShapeShift () const
 
bool IsInFeralForm () const
 
void setTransForm (uint32 spellid)
 
uint32 getTransForm () const
 
void DeMorph ()
 
virtual float GetNativeObjectScale () const
 
virtual void RecalculateObjectScale ()
 
uint32 GetDisplayId () const
 
virtual void SetDisplayId (uint32 modelId, float displayScale=1.f)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 displayId)
 
uint32 GetModelForForm (ShapeshiftForm form, uint32 spellId)
 
virtual bool IsInWater () const
 
virtual bool IsUnderWater () const
 
void NearTeleportTo (Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void NearTeleportTo (float x, float y, float z, float orientation, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void SetInFront (WorldObject const *target)
 
void SetFacingTo (float ori)
 
void SetFacingToObject (WorldObject *object)
 
void SetTimedFacingToObject (WorldObject *object, uint32 time)
 
bool isInAccessiblePlaceFor (Creature const *c) const
 
bool isInFrontInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool isInBackInMap (Unit const *target, float distance, float arc=M_PI) const
 
float GetCollisionHeight () const override
 Return collision height sent to client. More...
 
float GetCollisionWidth () const override
 this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC More...
 
float GetCollisionRadius () const override
 this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC More...
 
void UpdateOrientation (float orientation)
 Only server-side orientation update, does not broadcast to client. More...
 
void UpdateHeight (float newZ)
 Only server-side height update, does not broadcast to client. More...
 
virtual bool UpdatePosition (float x, float y, float z, float ang, bool teleport=false)
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void ProcessPositionDataChanged (PositionFullTerrainStatus const &data) override
 
virtual void ProcessTerrainStatusUpdate ()
 
bool IsVisible () const
 
void SetVisible (bool x)
 
void SetModelVisible (bool on)
 
uint32 GetPhaseByAuras () const
 
void SetPhaseMask (uint32 newPhaseMask, bool update) override
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
void AddPointedBy (SafeUnitPointer *sup)
 
void RemovePointedBy (SafeUnitPointer *sup)
 
void SendAttackStateUpdate (CalcDamageInfo *damageInfo)
 
void SendAttackStateUpdate (uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
 
void SendComboPoints ()
 
void SendPlaySpellVisual (uint32 id)
 
void SendPlaySpellImpact (ObjectGuid guid, uint32 id)
 
void SendPetActionFeedback (uint8 msg)
 -------—Pet responses methods--------------— More...
 
void SendPetTalk (uint32 pettalk)
 
void SendPetAIReaction (ObjectGuid guid)
 
void SendPeriodicAuraLog (SpellPeriodicAuraLogInfo *pInfo)
 
void SendSpellNonMeleeDamageLog (SpellNonMeleeDamage *log)
 
void SendSpellNonMeleeReflectLog (SpellNonMeleeDamage *log, Unit *attacker)
 
void SendSpellNonMeleeDamageLog (Unit *target, SpellInfo const *spellInfo, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit=false, bool Split=false)
 
void SendSpellMiss (Unit *target, uint32 spellID, SpellMissInfo missInfo)
 
void SendSpellDamageResist (Unit *target, uint32 spellId)
 
void SendSpellDamageImmune (Unit *target, uint32 spellId)
 
void SendTameFailure (uint8 result)
 
void SendTeleportPacket (Position &pos)
 
void SendMovementFlagUpdate (bool self=false)
 
void SendMovementWaterWalking (Player *sendTo)
 
void SendMovementFeatherFall (Player *sendTo)
 
void SendMovementHover (Player *sendTo)
 
void SendChangeCurrentVictimOpcode (HostileReference *pHostileReference)
 
void SendClearThreatListOpcode ()
 
void SendRemoveFromThreatListOpcode (HostileReference *pHostileReference)
 
void SendThreatListUpdate ()
 
void SendClearTarget ()
 
void ExecuteDelayedUnitRelocationEvent ()
 
void ExecuteDelayedUnitAINotifyEvent ()
 
void BuildHeartBeatMsg (WorldPacket *data) const
 
void BuildMovementPacket (ByteBuffer *data) const
 
void OutDebugInfo () const
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
virtual void Update (uint32 diff)
 
void _Create (ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void GetNearPoint2D (WorldObject const *searcher, float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint2D (float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint (WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
 
void GetVoidClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0, float controlZ=0) const
 
bool GetClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
 
void MovePosition (Position &pos, float dist, float angle)
 
Position GetNearPosition (float dist, float angle)
 
void MovePositionToFirstCollision (Position &pos, float dist, float angle)
 
Position GetFirstCollisionPosition (float startX, float startY, float startZ, float destX, float destY)
 
Position GetFirstCollisionPosition (float destX, float destY, float destZ)
 
Position GetFirstCollisionPosition (float dist, float angle)
 
Position GetRandomNearPosition (float radius)
 
void GetContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
void GetChargeContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
float GetObjectSize () const
 
virtual float GetCombatReach () const
 
void UpdateGroundPositionZ (float x, float y, float &z) const
 
void UpdateAllowedPositionZ (float x, float y, float &z, float *groundZ=nullptr) const
 
void GetRandomPoint (const Position &srcPos, float distance, float &rand_x, float &rand_y, float &rand_z) const
 
Position GetRandomPoint (const Position &srcPos, float distance) const
 
uint32 GetInstanceId () const
 
virtual void SetPhaseMask (uint32 newPhaseMask, bool update)
 
uint32 GetPhaseMask () const
 
bool InSamePhase (WorldObject const *obj) const
 
bool InSamePhase (uint32 phasemask) const
 
uint32 GetZoneId () const
 
uint32 GetAreaId () const
 
void GetZoneAndAreaId (uint32 &zoneid, uint32 &areaid) const
 
bool IsOutdoors () const
 
LiquidData const & GetLiquidData () const
 
InstanceScriptGetInstanceScript () const
 
std::string const & GetName () const
 
void SetName (std::string const &newname)
 
virtual std::string const & GetNameForLocaleIdx (LocaleConstant) const
 
float GetDistance (WorldObject const *obj) const
 
float GetDistance (const Position &pos) const
 
float GetDistance (float x, float y, float z) const
 
float GetDistance2d (WorldObject const *obj) const
 
float GetDistance2d (float x, float y) const
 
float GetDistanceZ (WorldObject const *obj) const
 
bool IsSelfOrInSameMap (WorldObject const *obj) const
 
bool IsInMap (WorldObject const *obj) const
 
bool IsWithinDist3d (float x, float y, float z, float dist) const
 
bool IsWithinDist3d (const Position *pos, float dist) const
 
bool IsWithinDist2d (float x, float y, float dist) const
 
bool IsWithinDist2d (const Position *pos, float dist) const
 
bool IsWithinDist (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinLOS (float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
 
bool IsWithinLOSInMap (WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
Position GetHitSpherePointFor (Position const &dest, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
void GetHitSpherePointFor (Position const &dest, float &x, float &y, float &z, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
bool GetDistanceOrder (WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
 
bool IsInRange (WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
 
bool IsInRange2d (float x, float y, float minRange, float maxRange) const
 
bool IsInRange3d (float x, float y, float z, float minRange, float maxRange) const
 
bool isInFront (WorldObject const *target, float arc=M_PI) const
 
bool isInBack (WorldObject const *target, float arc=M_PI) const
 
bool IsInBetween (WorldObject const *obj1, WorldObject const *obj2, float size=0) const
 
virtual void CleanupsBeforeDelete (bool finalCleanup=true)
 
virtual void SendMessageToSet (WorldPacket const *data, bool self) const
 
virtual void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const
 
virtual void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const
 
virtual uint8 getLevelForTarget (WorldObject const *) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayRadiusSound (uint32 sound_id, float radius)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void PlayRadiusMusic (uint32 music_id, float radius)
 
template<typename Worker >
void DoForAllVisiblePlayers (Worker &&worker)
 
template<typename Worker >
void DoForAllVisibleWorldObjects (Worker &&worker)
 
void DestroyForVisiblePlayers ()
 
void SendObjectDeSpawnAnim (ObjectGuid guid)
 
virtual void SaveRespawnTime ()
 
void AddObjectToRemoveList ()
 
float GetGridActivationRange () const
 
float GetVisibilityRange () const
 
virtual float GetSightRange (WorldObject const *target=nullptr) const
 
bool CanSeeOrDetect (WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
 
void SendPlayMusic (uint32 Music, bool OnlySelf)
 
virtual void SetMap (Map *map)
 
virtual void ResetMap ()
 
MapGetMap () const
 
MapFindMap () const
 
void SetZoneScript ()
 
void ClearZoneScript ()
 
ZoneScriptGetZoneScript () const
 
TempSummonSummonCreature (uint32 id, const Position &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
 
TempSummonSummonCreature (uint32 id, float x, float y, float z, float ang=0, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
 
CreatureSummonTrigger (float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
CreatureFindNearestCreature (uint32 entry, float range, bool alive=true) const
 
GameObjectFindNearestGameObject (uint32 entry, float range, bool onlySpawned=false) const
 
GameObjectFindNearestGameObjectOfType (GameobjectTypes type, float range) const
 
PlayerSelectNearestPlayer (float distance=0) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &gameobjectList, std::vector< uint32 > const &entries, float maxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &creatureList, std::vector< uint32 > const &entries, float maxSearchRange) const
 
void GetDeadCreatureListInGrid (std::list< Creature * > &lList, float maxSearchRange, bool alive=false) const
 
virtual void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false)
 
virtual void UpdateObjectVisibilityOnCreate ()
 
void BuildUpdate (UpdateDataMapType &data_map) override
 
void GetCreaturesWithEntryInRange (std::list< Creature * > &creatureList, float radius, uint32 entry)
 
void SetPositionDataUpdate ()
 
void UpdatePositionData ()
 
void AddToObjectUpdate () override
 
void RemoveFromObjectUpdate () override
 
void AddToNotify (uint16 f)
 
void RemoveFromNotify (uint16 f)
 
bool isNeedNotify (uint16 f) const
 
uint16 GetNotifyFlags () const
 
bool NotifyExecuted (uint16 f) const
 
void SetNotified (uint16 f)
 
void ResetAllNotifies ()
 
bool isActiveObject () const
 
void setActive (bool isActiveObject)
 
VisibilityDistanceType GetVisibilityOverrideType () const
 
bool IsVisibilityOverridden () const
 
bool IsZoneWideVisible () const
 
bool IsFarVisible () const
 
float GetVisibilityOverrideDistance () const
 
void SetVisibilityDistanceOverride (VisibilityDistanceType type)
 
bool IsInWintergrasp () const
 
TransportGetTransport () const
 
float GetTransOffsetX () const
 
float GetTransOffsetY () const
 
float GetTransOffsetZ () const
 
float GetTransOffsetO () const
 
uint32 GetTransTime () const
 
int8 GetTransSeat () const
 
virtual ObjectGuid GetTransGUID () const
 
void SetTransport (Transport *t)
 
virtual float GetStationaryX () const
 
virtual float GetStationaryY () const
 
virtual float GetStationaryZ () const
 
virtual float GetStationaryO () const
 
float GetMapWaterOrGroundLevel (Position pos, float *ground=nullptr) const
 
float GetMapWaterOrGroundLevel (float x, float y, float z, float *ground=nullptr) const
 
float GetMapHeight (float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
 
float GetFloorZ () const
 
float GetMinHeightInWater () const
 Get the minimum height of a object that should be in water to start floating/swim. More...
 
virtual float GetCollisionHeight () const
 
virtual float GetCollisionWidth () const
 
virtual float GetCollisionRadius () const
 
void AddAllowedLooter (ObjectGuid guid)
 
void ResetAllowedLooters ()
 
void SetAllowedLooters (GuidUnorderedSet const looters)
 
bool HasAllowedLooter (ObjectGuid guid) const
 
GuidUnorderedSet const & GetAllowedLooters () const
 
void RemoveAllowedLooter (ObjectGuid guid)
 
virtual bool IsUpdateNeeded ()
 
bool CanBeAddedToMapUpdateList ()
 
std::string GetDebugInfo () const override
 
ObjectVisibilityContainerGetObjectVisibilityContainer ()
 
ObjectVisibilityContainer const & GetObjectVisibilityContainer () const
 
- Public Member Functions inherited from Object
virtual ~Object ()
 
bool IsInWorld () const
 
virtual void AddToWorld ()
 
virtual void RemoveFromWorld ()
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
virtual void SetObjectScale (float scale)
 
virtual uint32 GetDynamicFlags () const
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
virtual void ReplaceAllDynamicFlags (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
virtual void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void BuildOutOfRangeUpdateBlock (UpdateData *data) const
 
void BuildMovementUpdateBlock (UpdateData *data, uint32 flags=0) const
 
virtual void DestroyForPlayer (Player *target, bool onDeath=false) const
 
int32 GetInt32Value (uint16 index) const
 
uint32 GetUInt32Value (uint16 index) const
 
uint64 GetUInt64Value (uint16 index) const
 
float GetFloatValue (uint16 index) const
 
uint8 GetByteValue (uint16 index, uint8 offset) const
 
uint16 GetUInt16Value (uint16 index, uint8 offset) const
 
ObjectGuid GetGuidValue (uint16 index) const
 
void SetInt32Value (uint16 index, int32 value)
 
void SetUInt32Value (uint16 index, uint32 value)
 
void UpdateUInt32Value (uint16 index, uint32 value)
 
void SetUInt64Value (uint16 index, uint64 value)
 
void SetFloatValue (uint16 index, float value)
 
void SetByteValue (uint16 index, uint8 offset, uint8 value)
 
void SetUInt16Value (uint16 index, uint8 offset, uint16 value)
 
void SetInt16Value (uint16 index, uint8 offset, int16 value)
 
void SetGuidValue (uint16 index, ObjectGuid value)
 
void SetStatFloatValue (uint16 index, float value)
 
void SetStatInt32Value (uint16 index, int32 value)
 
bool AddGuidValue (uint16 index, ObjectGuid value)
 
bool RemoveGuidValue (uint16 index, ObjectGuid value)
 
void ApplyModUInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModUInt64Value (uint16 index, int32 val, bool apply)
 
void ApplyModPositiveFloatValue (uint16 index, float val, bool apply)
 
void ApplyModSignedFloatValue (uint16 index, float val, bool apply)
 
void ApplyPercentModFloatValue (uint16 index, float val, bool apply)
 
void SetFlag (uint16 index, uint32 newFlag)
 
void RemoveFlag (uint16 index, uint32 oldFlag)
 
void ToggleFlag (uint16 index, uint32 flag)
 
bool HasFlag (uint16 index, uint32 flag) const
 
void ApplyModFlag (uint16 index, uint32 flag, bool apply)
 
void SetByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
void RemoveByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
bool HasByteFlag (uint16 index, uint8 offset, uint8 flag) const
 
void SetFlag64 (uint16 index, uint64 newFlag)
 
void RemoveFlag64 (uint16 index, uint64 oldFlag)
 
void ToggleFlag64 (uint16 index, uint64 flag)
 
bool HasFlag64 (uint16 index, uint64 flag) const
 
void ApplyModFlag64 (uint16 index, uint64 flag, bool apply)
 
void ClearUpdateMask (bool remove)
 
uint16 GetValuesCount () const
 
virtual bool hasQuest (uint32) const
 
virtual bool hasInvolvedQuest (uint32) const
 
virtual void BuildUpdate (UpdateDataMapType &)
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &)
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
bool IsCreature () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
bool IsUnit () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
bool IsGameObject () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
bool IsCorpse () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
bool IsDynamicObject () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
bool IsItem () const
 
virtual void Heartbeat ()
 
virtual std::string GetDebugInfo () const
 
template<typename... T>
bool EntryEquals (T... entries) const
 
- Public Member Functions inherited from WorldLocation
 WorldLocation (uint32 _mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
 WorldLocation (uint32 mapId, Position const &position)
 
void WorldRelocate (const WorldLocation &loc)
 
void WorldRelocate (uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
void SetMapId (uint32 mapId)
 
uint32 GetMapId () const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z, float &o) const
 
void GetWorldLocation (WorldLocation *location) const
 
WorldLocation GetWorldLocation () const
 
std::string GetDebugInfo () const
 
- Public Member Functions inherited from Position
 Position (float x=0, float y=0, float z=0, float o=0)
 
 Position (Position const &loc)
 
 Position (Position &&)=default
 
Positionoperator= (const Position &)=default
 
Positionoperator= (Position &&)=default
 
bool operator== (Position const &a) const
 
bool operator!= (Position const &a)
 
bool operator!= (Position const &a) const
 
 operator G3D::Vector3 () const
 
void Relocate (float x, float y)
 
void Relocate (float x, float y, float z)
 
void Relocate (float x, float y, float z, float orientation)
 
void Relocate (const Position &pos)
 
void Relocate (const Position *pos)
 
void RelocatePolarOffset (float angle, float dist, float z=0.0f)
 
void RelocateOffset (const Position &offset)
 
void SetOrientation (float orientation)
 
float GetPositionX () const
 
float GetPositionY () const
 
float GetPositionZ () const
 
float GetOrientation () const
 
void GetPosition (float &x, float &y) const
 
void GetPosition (float &x, float &y, float &z) const
 
void GetPosition (float &x, float &y, float &z, float &o) const
 
Position GetPosition () const
 
Position::PositionXYZStreamer PositionXYZStream ()
 
Position::PositionXYZOStreamer PositionXYZOStream ()
 
bool IsPositionValid () const
 
float GetExactDist2dSq (const float x, const float y) const
 
float GetExactDist2dSq (Position const &pos) const
 
float GetExactDist2dSq (Position const *pos) const
 
float GetExactDist2d (const float x, const float y) const
 
float GetExactDist2d (Position const &pos) const
 
float GetExactDist2d (Position const *pos) const
 
float GetExactDistSq (float x, float y, float z) const
 
float GetExactDistSq (Position const &pos) const
 
float GetExactDistSq (Position const *pos) const
 
float GetExactDist (float x, float y, float z) const
 
float GetExactDist (Position const &pos) const
 
float GetExactDist (Position const *pos) const
 
void GetPositionOffsetTo (const Position &endPos, Position &retOffset) const
 
Position GetPositionWithOffset (Position const &offset) const
 
float GetAngle (const Position *pos) const
 
float GetAngle (float x, float y) const
 
float GetAbsoluteAngle (float x, float y) const
 
float GetAbsoluteAngle (Position const &pos) const
 
float GetAbsoluteAngle (Position const *pos) const
 
float GetRelativeAngle (const Position *pos) const
 
float GetRelativeAngle (float x, float y) const
 
float ToAbsoluteAngle (float relAngle) const
 
void GetSinCos (float x, float y, float &vsin, float &vcos) const
 
bool IsInDist2d (float x, float y, float dist) const
 
bool IsInDist2d (const Position *pos, float dist) const
 
bool IsInDist (float x, float y, float z, float dist) const
 
bool IsInDist (const Position *pos, float dist) const
 
bool IsWithinBox (const Position &center, float xradius, float yradius, float zradius) const
 
bool HasInArc (float arcangle, const Position *pos, float targetRadius=0.0f) const
 
bool HasInLine (Position const *pos, float width) const
 
bool HasInLine (Position const *pos, float objSize, float width) const
 
std::string ToString () const
 

Static Public Member Functions

static void ApplyResilience (Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
 
static float GetEffectiveResistChance (Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
 
static uint32 DealDamage (Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
 
static void DealDamageMods (Unit const *victim, uint32 &damage, uint32 *absorb)
 
static void Kill (Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
static bool IsDamageReducedByArmor (SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
 
static uint32 CalcArmorReducedDamage (Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
 
static uint32 SpellCriticalDamageBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void ProcDamageAndSpell (Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
static int32 DealHeal (Unit *healer, Unit *victim, uint32 addhealth)
 
static uint32 SpellCriticalHealingBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void CalcAbsorbResist (DamageInfo &dmgInfo, bool Splited=false)
 
static void CalcHealAbsorb (HealInfo &healInfo)
 
static void HandleSafeUnitPointersOnDelete (Unit *thisUnit)
 
- Static Public Member Functions inherited from Object
static ObjectGuid GetGUID (Object const *o)
 
- Static Public Member Functions inherited from Position
static float NormalizeOrientation (float o)
 

Public Attributes

uint32 m_extraAttacks
 
bool m_canDualWield
 
ControlSet m_Controlled
 
SafeUnitPointer m_movedByPlayer
 
ObjectGuid m_SummonSlot [MAX_SUMMON_SLOT]
 
ObjectGuid m_ObjectSlot [MAX_GAMEOBJECT_SLOT]
 
float m_modMeleeHitChance
 
float m_modRangedHitChance
 
float m_modSpellHitChance
 
int32 m_baseSpellCritChance
 
float m_threatModifier [MAX_SPELL_SCHOOL]
 
float m_modAttackSpeedPct [3]
 
SpellImmuneList m_spellImmune [MAX_SPELL_IMMUNITY]
 
uint32 m_lastSanctuaryTime
 
PetAuraSet m_petAuras
 
bool IsAIEnabled
 
bool NeedChangeAI
 
bool m_ControlledByPlayer
 
bool m_CreatedByPlayer
 
std::set< SafeUnitPointer * > SafeUnitPointerSet
 
Position m_last_notify_position
 
uint32 m_last_notify_mstime
 
uint16 m_delayed_unit_relocation_timer
 
uint16 m_delayed_unit_ai_notify_timer
 
bool bRequestForcedVisibilityUpdate
 
Movement::MoveSplinemovespline
 
- Public Attributes inherited from WorldObject
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealth
 
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealthDetect
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibility
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibilityDetect
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibility
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibilityDetect
 
uint32 LastUsedScriptID
 
MovementInfo m_movementInfo
 
ElunaEventProcessor * elunaEvents
 
EventProcessor m_Events
 
- Public Attributes inherited from Object
DataMap CustomData
 
- Public Attributes inherited from WorldLocation
uint32 m_mapId
 
- Public Attributes inherited from Position
float m_positionX = 0
 
float m_positionY = 0
 
float m_positionZ = 0
 
float m_orientation = 0
 

Protected Types

typedef std::list< DynamicObject * > DynObjectList
 
typedef GuidList GameObjectList
 
typedef std::map< ObjectGuid, float > CharmThreatMap
 

Protected Member Functions

 Unit ()
 
void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target) override
 
void _UpdateSpells (uint32 time)
 
void _DeleteRemovedAuras ()
 
void _UpdateAutoRepeatSpell ()
 
bool CanSparringWith (Unit const *attacker) const
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 : Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures. More...
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
void SetFeared (bool apply, Unit *fearedBy=nullptr, bool isFear=false)
 
void SetConfused (bool apply)
 
void SetStunned (bool apply)
 
void SetRooted (bool apply, bool isStun=false)
 
- Protected Member Functions inherited from WorldObject
 WorldObject ()
 
virtual void ProcessPositionDataChanged (PositionFullTerrainStatus const &data)
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsNeverVisible () const
 
virtual bool IsAlwaysVisibleFor (WorldObject const *) const
 
virtual bool IsInvisibleDueToDespawn () const
 
virtual bool IsAlwaysDetectableFor (WorldObject const *) const
 
- Protected Member Functions inherited from Object
 Object ()
 
void _InitValues ()
 
void _Create (ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
 
std::string _ConcatFields (uint16 startIndex, uint16 size) const
 
bool _LoadIntoDataField (std::string const &data, uint32 startOffset, uint32 count)
 
uint32 GetUpdateFieldData (Player const *target, uint32 *&flags) const
 
void BuildMovementUpdate (ByteBuffer *data, uint16 flags) const
 
virtual void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target)
 
virtual void AddToObjectUpdate ()=0
 
virtual void RemoveFromObjectUpdate ()=0
 
void AddToObjectUpdateIfNeeded ()
 

Protected Attributes

UnitAIi_AI
 
UnitAIi_disabledAI
 
uint8 m_realRace
 
uint8 m_race
 
bool m_AutoRepeatFirstCast
 
int32 m_attackTimer [MAX_ATTACK]
 
float m_createStats [MAX_STATS]
 
AttackerSet m_attackers
 
Unitm_attacking
 
DeathState m_deathState
 
int32 m_procDeep
 
DynObjectList m_dynObj
 
GameObjectList m_gameObj
 
uint32 m_transform
 
Spellm_currentSpells [CURRENT_MAX_SPELL]
 
AuraMap m_ownedAuras
 
AuraApplicationMap m_appliedAuras
 
AuraList m_removedAuras
 
AuraMap::iterator m_auraUpdateIterator
 
uint32 m_removedAurasCount
 
AuraEffectList m_modAuras [TOTAL_AURAS]
 
AuraList m_scAuras
 
AuraApplicationList m_interruptableAuras
 
AuraStateAurasMap m_auraStateAuras
 
uint32 m_interruptMask
 
float m_auraModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_END]
 
float m_weaponDamage [MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
 
bool m_canModifyStats
 
VisibleAuraMap m_visibleAuras
 
float m_speed_rate [MAX_MOVE_TYPE]
 
CharmInfom_charmInfo
 
SharedVisionList m_sharedVision
 
MotionMasteri_motionMaster
 
uint32 m_reactiveTimer [MAX_REACTIVE]
 
int32 m_regenTimer
 
ThreatMgr m_ThreatMgr
 
CharmThreatMap _charmThreatInfo
 
Vehiclem_vehicle
 
Vehiclem_vehicleKit
 
uint32 m_unitTypeMask
 
LiquidTypeEntry const * _lastLiquid
 
bool m_applyResilience
 
bool _instantCast
 
uint32 m_rootTimes
 
- Protected Attributes inherited from WorldObject
std::string m_name
 
bool m_isActive
 
VisibilityDistanceType _visibilityDistanceOverrideType
 
ZoneScriptm_zoneScript
 
uint32 _zoneId
 
uint32 _areaId
 
float _floorZ
 
bool _outdoors
 
LiquidData _liquidData
 
bool _updatePositionData
 
Transportm_transport
 
- Protected Attributes inherited from Object
uint16 m_objectType
 
TypeID m_objectTypeId
 
uint16 m_updateFlag
 
union {
   int32 *   m_int32Values
 
   uint32 *   m_uint32Values
 
   float *   m_floatValues
 
}; 
 
UpdateMask _changesMask
 
uint16 m_valuesCount
 
uint16 _fieldNotifyFlags
 
bool m_objectUpdated
 

Private Types

typedef std::unordered_map< uint64, BuildValuesCachedBufferValuesUpdateCache
 

Private Member Functions

bool IsTriggeredAtSpellProcEvent (Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
 
bool HandleDummyAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
 
bool HandleAuraProc (Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
 
bool HandleProcTriggerSpell (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
 
bool HandleOverrideClassScriptAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
 
bool HandleAuraRaidProcFromChargeWithValue (AuraEffect *triggeredByAura)
 
bool HandleAuraRaidProcFromCharge (AuraEffect *triggeredByAura)
 
void UpdateSplineMovement (uint32 t_diff)
 
void UpdateSplinePosition ()
 
float GetCombatRatingReduction (CombatRating cr) const
 
uint32 GetCombatRatingDamageReduction (CombatRating cr, float rate, float cap, uint32 damage) const
 
void PatchValuesUpdate (ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
 
void InvalidateValuesUpdateCache ()
 
float processDummyAuras (float TakenTotalMod) const
 
void _addAttacker (Unit *pAttacker)
 
void _removeAttacker (Unit *pAttacker)
 

Private Attributes

uint32 m_state
 
uint32 m_CombatTimer
 
uint32 m_lastManaUse
 
Diminishing m_Diminishing
 
HostileRefMgr m_HostileRefMgr
 
FollowerRefMgr m_FollowingRefMgr
 
Unitm_comboTarget
 
int8 m_comboPoints
 
std::unordered_set< Unit * > m_ComboPointHolders
 
RedirectThreatInfo _redirectThreatInfo
 
bool m_cleanupDone
 
bool m_duringRemoveFromWorld
 
uint32 _oldFactionId
 faction before charm More...
 
bool _isWalkingBeforeCharm
 Are we walking before we were charmed? More...
 
uint32 _lastExtraAttackSpell
 
std::unordered_map< ObjectGuid, uint32extraAttacksTargets
 
ObjectGuid _lastDamagedTargetGuid
 
ValuesUpdateCache _valuesUpdateCache
 

Detailed Description

Member Typedef Documentation

◆ AttackerSet

typedef std::unordered_set<Unit*> Unit::AttackerSet

◆ AuraApplicationList

◆ AuraApplicationMap

◆ AuraApplicationMapBounds

typedef std::pair<AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator> Unit::AuraApplicationMapBounds

◆ AuraApplicationMapBoundsNonConst

typedef std::pair<AuraApplicationMap::iterator, AuraApplicationMap::iterator> Unit::AuraApplicationMapBoundsNonConst

◆ AuraEffectList

typedef std::vector<AuraEffect*> Unit::AuraEffectList

◆ AuraList

typedef std::list<Aura*> Unit::AuraList

◆ AuraMap

typedef std::multimap<uint32, Aura*> Unit::AuraMap

◆ AuraMapBounds

typedef std::pair<AuraMap::const_iterator, AuraMap::const_iterator> Unit::AuraMapBounds

◆ AuraMapBoundsNonConst

typedef std::pair<AuraMap::iterator, AuraMap::iterator> Unit::AuraMapBoundsNonConst

◆ AuraStateAurasMap

◆ AuraStateAurasMapBounds

typedef std::pair<AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator> Unit::AuraStateAurasMapBounds

◆ CharmThreatMap

typedef std::map<ObjectGuid, float> Unit::CharmThreatMap
protected

◆ ComboPointHolderSet

◆ ControlSet

typedef std::set<Unit*> Unit::ControlSet

◆ Diminishing

◆ DynObjectList

typedef std::list<DynamicObject*> Unit::DynObjectList
protected

◆ GameObjectList

typedef GuidList Unit::GameObjectList
protected

◆ PetAuraSet

typedef std::set<PetAura const*> Unit::PetAuraSet

◆ ValuesUpdateCache

typedef std::unordered_map<uint64 , BuildValuesCachedBuffer> Unit::ValuesUpdateCache
private

◆ VisibleAuraMap

Constructor & Destructor Documentation

◆ ~Unit()

Unit::~Unit ( )
override
341{
342 // set current spells as deletable
343 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
344 if (m_currentSpells[i])
345 {
347 m_currentSpells[i] = nullptr;
348 }
349
351
352 delete i_motionMaster;
353 delete m_charmInfo;
354 delete movespline;
355
358 ASSERT(m_attackers.empty());
359
360 // pussywizard: clear m_sharedVision along with back references
361 if (!m_sharedVision.empty())
362 {
363 do
364 {
365 Player* p = *(m_sharedVision.begin());
366 p->m_isInSharedVisionOf.erase(this);
367 m_sharedVision.remove(p);
368 } while (!m_sharedVision.empty());
369 }
370
371 ASSERT(m_Controlled.empty());
372 ASSERT(m_appliedAuras.empty());
373 ASSERT(m_ownedAuras.empty());
374 ASSERT(m_removedAuras.empty());
375 ASSERT(m_gameObj.empty());
376 ASSERT(m_dynObj.empty());
377
378 if (m_movedByPlayer && m_movedByPlayer != this)
379 LOG_INFO("misc", "Unit::~Unit (A1)");
380
382}
#define CURRENT_MAX_SPELL
Definition: Unit.h:545
std::uint8_t uint8
Definition: Define.h:109
#define ASSERT
Definition: Errors.h:68
#define LOG_INFO(filterType__,...)
Definition: Log.h:166
Definition: Player.h:1072
std::set< Unit * > m_isInSharedVisionOf
Definition: Player.h:2339
bool m_duringRemoveFromWorld
Definition: Unit.h:2169
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition: Unit.h:2081
AuraList m_removedAuras
Definition: Unit.h:2085
ControlSet m_Controlled
Definition: Unit.h:1993
Movement::MoveSpline * movespline
Definition: Unit.h:2032
CharmInfo * m_charmInfo
Definition: Unit.h:2102
MotionMaster * i_motionMaster
Definition: Unit.h:2105
void _DeleteRemovedAuras()
Definition: Unit.cpp:3869
DynObjectList m_dynObj
Definition: Unit.h:2075
SafeUnitPointer m_movedByPlayer
Definition: Unit.h:1995
AttackerSet m_attackers
Definition: Unit.h:2067
Unit * m_attacking
Definition: Unit.h:2068
GameObjectList m_gameObj
Definition: Unit.h:2078
AuraMap m_ownedAuras
Definition: Unit.h:2083
AuraApplicationMap m_appliedAuras
Definition: Unit.h:2084
static void HandleSafeUnitPointersOnDelete(Unit *thisUnit)
Definition: Unit.cpp:4394
SharedVisionList m_sharedVision
Definition: Unit.h:2103
void SetReferencedFromCurrent(bool yes)
Definition: Spell.h:571

References _DeleteRemovedAuras(), ASSERT, CURRENT_MAX_SPELL, HandleSafeUnitPointersOnDelete(), i_motionMaster, LOG_INFO, m_appliedAuras, m_attackers, m_attacking, m_charmInfo, m_Controlled, m_currentSpells, m_duringRemoveFromWorld, m_dynObj, m_gameObj, Player::m_isInSharedVisionOf, m_movedByPlayer, m_ownedAuras, m_removedAuras, m_sharedVision, movespline, and Spell::SetReferencedFromCurrent().

◆ Unit()

Unit::Unit ( )
explicitprotected
205 : WorldObject(),
206 m_movedByPlayer(nullptr),
208 IsAIEnabled(false),
209 NeedChangeAI(false),
211 m_CreatedByPlayer(false),
213 i_AI(nullptr),
214 i_disabledAI(nullptr),
215 m_realRace(0),
216 m_race(0),
218 m_procDeep(0),
220 i_motionMaster(new MotionMaster(this)),
221 m_regenTimer(0),
222 m_ThreatMgr(this),
223 m_vehicle(nullptr),
224 m_vehicleKit(nullptr),
226 m_HostileRefMgr(this),
227 m_comboTarget(nullptr),
229{
230#ifdef _MSC_VER
231#pragma warning(default:4355)
232#endif
235
237
244
245 m_canDualWield = false;
246
247 m_rootTimes = 0;
248
249 m_state = 0;
250 m_deathState = DeathState::Alive;
251
252 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
253 m_currentSpells[i] = nullptr;
254
255 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
256 m_SummonSlot[i].Clear();
257
258 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
259 m_ObjectSlot[i].Clear();
260
262
263 m_interruptMask = 0;
264 m_transform = 0;
265 m_canModifyStats = false;
266
267 for (uint8 i = 0; i < MAX_SPELL_IMMUNITY; ++i)
268 m_spellImmune[i].clear();
269
270 for (uint8 i = 0; i < UNIT_MOD_END; ++i)
271 {
276 }
277 // implement 50% base damage from offhand
279
280 for (uint8 i = 0; i < MAX_ATTACK; ++i)
281 {
284
285 m_weaponDamage[i][MINDAMAGE][1] = 0.f;
286 m_weaponDamage[i][MAXDAMAGE][1] = 0.f;
287 }
288
289 for (uint8 i = 0; i < MAX_STATS; ++i)
290 m_createStats[i] = 0.0f;
291
292 m_attacking = nullptr;
293 m_modMeleeHitChance = 0.0f;
295 m_modSpellHitChance = 0.0f;
297
298 m_CombatTimer = 0;
299 m_lastManaUse = 0;
300
301 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
302 m_threatModifier[i] = 1.0f;
303
304 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
305 m_speed_rate[i] = 1.0f;
306
307 m_charmInfo = nullptr;
308
310
311 // remove aurastates allowing special moves
312 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
313 m_reactiveTimer[i] = 0;
314
315 m_cleanupDone = false;
317
319
320 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
325
326 m_applyResilience = false;
327 _instantCast = false;
328
329 _lastLiquid = nullptr;
330
331 _oldFactionId = 0;
332
333 _isWalkingBeforeCharm = false;
334
336}
@ UPDATEFLAG_LIVING
Definition: UpdateData.h:44
@ UPDATEFLAG_STATIONARY_POSITION
Definition: UpdateData.h:45
@ TYPEID_UNIT
Definition: ObjectGuid.h:35
@ TYPEMASK_UNIT
Definition: ObjectGuid.h:49
@ UNIT_MASK_NONE
Definition: UnitDefines.h:155
#define MAX_MOVE_TYPE
Definition: UnitDefines.h:362
@ MINDAMAGE
Definition: Unit.h:136
@ MAXDAMAGE
Definition: Unit.h:137
@ UNIT_MOD_DAMAGE_OFFHAND
Definition: Unit.h:167
@ UNIT_MOD_END
Definition: Unit.h:169
@ OFF_ATTACK
Definition: Unit.h:211
@ MAX_ATTACK
Definition: Unit.h:213
@ BASE_ATTACK
Definition: Unit.h:210
@ RANGED_ATTACK
Definition: Unit.h:212
@ BASE_VALUE
Definition: Unit.h:127
@ TOTAL_VALUE
Definition: Unit.h:129
@ TOTAL_PCT
Definition: Unit.h:130
@ BASE_PCT
Definition: Unit.h:128
#define BASE_MAXDAMAGE
Definition: Unit.h:41
@ MAX_REACTIVE
Definition: Unit.h:600
#define BASE_MINDAMAGE
Definition: Unit.h:40
@ SERVERSIDE_VISIBILITY_GHOST
Definition: SharedDefines.h:1285
#define MAX_STATS
Definition: SharedDefines.h:276
constexpr auto MAX_SPELL_SCHOOL
Definition: SharedDefines.h:303
@ MAX_SUMMON_SLOT
Definition: SharedDefines.h:3569
@ GHOST_VISIBILITY_ALIVE
Definition: SharedDefines.h:1292
#define MAX_GAMEOBJECT_SLOT
Definition: SharedDefines.h:3573
#define MAX_SPELL_IMMUNITY
Definition: SharedDefines.h:1415
Definition: ThreatMgr.h:293
uint16 m_objectType
Definition: Object.h:252
uint16 m_updateFlag
Definition: Object.h:255
TypeID m_objectTypeId
Definition: Object.h:254
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition: Object.h:395
WorldObject()
Definition: Object.cpp:1039
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition: Object.h:613
void Relocate(float x, float y)
Definition: Position.h:77
uint32 m_reactiveTimer[MAX_REACTIVE]
Definition: Unit.h:2107
uint32 m_lastSanctuaryTime
Definition: Unit.h:2009
LiquidTypeEntry const * _lastLiquid
Definition: Unit.h:2118
uint32 m_transform
Definition: Unit.h:2079
uint32 m_CombatTimer
Definition: Unit.h:2152
bool m_canModifyStats
Definition: Unit.h:2097
UnitAI * i_disabledAI
Definition: Unit.h:2056
bool NeedChangeAI
Definition: Unit.h:2016
uint32 m_state
Definition: Unit.h:2151
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]
Definition: Unit.h:2095
int32 m_attackTimer[MAX_ATTACK]
Definition: Unit.h:2063
float m_modAttackSpeedPct[3]
Definition: Unit.h:2006
uint8 m_realRace
Definition: Unit.h:2058
Vehicle * m_vehicle
Definition: Unit.h:2114
uint32 m_rootTimes
Definition: Unit.h:2124
uint8 m_race
Definition: Unit.h:2059
UnitAI * i_AI
Definition: Unit.h:2055
uint32 _lastExtraAttackSpell
Definition: Unit.h:2174
bool _instantCast
Definition: Unit.h:2122
ObjectGuid m_ObjectSlot[MAX_GAMEOBJECT_SLOT]
Definition: Unit.h:1998
RedirectThreatInfo _redirectThreatInfo
Definition: Unit.h:2166
float m_createStats[MAX_STATS]
Definition: Unit.h:2065
float m_modRangedHitChance
Definition: Unit.h:2001
DeathState m_deathState
Definition: Unit.h:2070
uint32 m_unitTypeMask
Definition: Unit.h:2117
uint32 m_removedAurasCount
Definition: Unit.h:2087
ThreatMgr m_ThreatMgr
Definition: Unit.h:2110
Unit * m_comboTarget
Definition: Unit.h:2162
AuraMap::iterator m_auraUpdateIterator
Definition: Unit.h:2086
bool m_AutoRepeatFirstCast
Definition: Unit.h:2061
uint16 m_delayed_unit_ai_notify_timer
Definition: Unit.h:2028
int32 m_regenTimer
Definition: Unit.h:2108
bool bRequestForcedVisibilityUpdate
Definition: Unit.h:2029
bool m_ControlledByPlayer
Definition: Unit.h:2018
uint32 m_last_notify_mstime
Definition: Unit.h:2026
SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY]
Definition: Unit.h:2008
int8 m_comboPoints
Definition: Unit.h:2163
uint32 _oldFactionId
faction before charm
Definition: Unit.h:2171
int32 m_baseSpellCritChance
Definition: Unit.h:2003
float m_modMeleeHitChance
Definition: Unit.h:2000
float m_weaponDamage[MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
Definition: Unit.h:2096
Position m_last_notify_position
Definition: Unit.h:2025
Vehicle * m_vehicleKit
Definition: Unit.h:2115
bool IsAIEnabled
Definition: Unit.h:2015
HostileRefMgr m_HostileRefMgr
Definition: Unit.h:2158
bool m_applyResilience
Definition: Unit.h:2121
bool m_canDualWield
Definition: Unit.h:1991
uint32 m_interruptMask
Definition: Unit.h:2093
int32 m_procDeep
Definition: Unit.h:2072
float m_speed_rate[MAX_MOVE_TYPE]
Definition: Unit.h:2100
float m_modSpellHitChance
Definition: Unit.h:2002
ObjectGuid m_SummonSlot[MAX_SUMMON_SLOT]
Definition: Unit.h:1997
bool m_cleanupDone
Definition: Unit.h:2168
bool _isWalkingBeforeCharm
Are we walking before we were charmed?
Definition: Unit.h:2172
bool m_CreatedByPlayer
Definition: Unit.h:2019
uint16 m_delayed_unit_relocation_timer
Definition: Unit.h:2027
float m_threatModifier[MAX_SPELL_SCHOOL]
Definition: Unit.h:2005
uint32 m_lastManaUse
Definition: Unit.h:2153
Definition: MotionMaster.h:112
Definition: MoveSpline.h:40

References _instantCast, _isWalkingBeforeCharm, _lastExtraAttackSpell, _lastLiquid, _oldFactionId, _redirectThreatInfo, BASE_ATTACK, BASE_MAXDAMAGE, BASE_MINDAMAGE, BASE_PCT, BASE_VALUE, bRequestForcedVisibilityUpdate, CURRENT_MAX_SPELL, GHOST_VISIBILITY_ALIVE, m_applyResilience, m_attacking, m_attackTimer, m_auraModifiersGroup, m_auraUpdateIterator, m_baseSpellCritChance, m_canDualWield, m_canModifyStats, m_charmInfo, m_cleanupDone, m_CombatTimer, m_createStats, m_currentSpells, m_deathState, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_duringRemoveFromWorld, m_interruptMask, m_last_notify_mstime, m_last_notify_position, m_lastManaUse, m_modAttackSpeedPct, m_modMeleeHitChance, m_modRangedHitChance, m_modSpellHitChance, m_ObjectSlot, Object::m_objectType, Object::m_objectTypeId, m_ownedAuras, m_reactiveTimer, m_rootTimes, WorldObject::m_serverSideVisibility, m_speed_rate, m_spellImmune, m_state, m_SummonSlot, m_threatModifier, m_transform, Object::m_updateFlag, m_weaponDamage, MAX_ATTACK, MAX_GAMEOBJECT_SLOT, MAX_MOVE_TYPE, MAX_REACTIVE, MAX_SPELL_IMMUNITY, MAX_SPELL_SCHOOL, MAX_STATS, MAX_SUMMON_SLOT, MAXDAMAGE, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, Position::Relocate(), SERVERSIDE_VISIBILITY_GHOST, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), TOTAL_PCT, TOTAL_VALUE, TYPEID_UNIT, TYPEMASK_UNIT, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_END, UPDATEFLAG_LIVING, and UPDATEFLAG_STATIONARY_POSITION.

Member Function Documentation

◆ _addAttacker()

void Unit::_addAttacker ( Unit pAttacker)
inlineprivate
2147{ m_attackers.insert(pAttacker); }

References m_attackers.

Referenced by Attack().

◆ _AddAura()

void Unit::_AddAura ( UnitAura aura,
Unit caster 
)
4480{
4482 m_ownedAuras.insert(AuraMap::value_type(aura->GetId(), aura));
4483
4485
4486 if (aura->IsRemoved())
4487 return;
4488
4490 if (aura->IsSingleTarget())
4491 {
4492 ASSERT((IsInWorld() && !IsDuringRemoveFromWorld()) || (aura->GetCasterGUID() == GetGUID()));
4493 /* @HACK: Player is not in world during loading auras.
4494 * Single target auras are not saved or loaded from database
4495 * but may be created as a result of aura links (player mounts with passengers)
4496 */
4497
4498 // register single target aura
4499 caster->GetSingleCastAuras().push_back(aura);
4500 // remove other single target auras
4501 Unit::AuraList& scAuras = caster->GetSingleCastAuras();
4502 for (Unit::AuraList::iterator itr = scAuras.begin(); itr != scAuras.end();)
4503 {
4504 if ((*itr) != aura &&
4505 (*itr)->IsSingleTargetWith(aura))
4506 {
4507 (*itr)->Remove();
4508 itr = scAuras.begin();
4509 }
4510 else
4511 ++itr;
4512 }
4513 }
4514}
@ SPELL_AURA_CONTROL_VEHICLE
Definition: SpellAuraDefines.h:299
bool IsInWorld() const
Definition: Object.h:108
ObjectGuid GetGUID() const
Definition: Object.h:114
void _RemoveNoStackAurasDueToAura(Aura *aura)
Definition: Unit.cpp:4732
std::list< Aura * > AuraList
Definition: Unit.h:637
bool IsDuringRemoveFromWorld() const
Definition: Unit.h:658
AuraList & GetSingleCastAuras()
Definition: Unit.h:1354
ObjectGuid GetCasterGUID() const
Definition: SpellAuras.h:105
bool IsRemoved() const
Definition: SpellAuras.h:161
uint32 GetId() const
Definition: SpellAuras.cpp:466
bool HasEffectType(AuraType type) const
Definition: SpellAuras.cpp:1222
SpellInfo const * GetSpellInfo() const
Definition: SpellAuras.h:100
void SetIsSingleTarget(bool val)
Definition: SpellAuras.h:166
bool IsSingleTarget() const
Definition: SpellAuras.h:164
bool IsSingleTarget() const
Definition: SpellInfo.cpp:1374

References _RemoveNoStackAurasDueToAura(), ASSERT, Aura::GetCasterGUID(), Object::GetGUID(), Aura::GetId(), GetSingleCastAuras(), Aura::GetSpellInfo(), Aura::HasEffectType(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Aura::IsRemoved(), Aura::IsSingleTarget(), SpellInfo::IsSingleTarget(), Aura::IsSingleTargetWith(), m_cleanupDone, m_ownedAuras, Aura::SetIsSingleTarget(), and SPELL_AURA_CONTROL_VEHICLE.

Referenced by UnitAura::UnitAura().

◆ _ApplyAllAuraStatMods()

void Unit::_ApplyAllAuraStatMods ( )
5554{
5555 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5556 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, true);
5557}
@ AURA_EFFECT_HANDLE_STAT
Definition: SpellAuraDefines.h:46

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_ApplyAllStatBonuses().

◆ _ApplyAura()

void Unit::_ApplyAura ( AuraApplication aurApp,
uint8  effMask 
)
4571{
4572 Aura* aura = aurApp->GetBase();
4573
4575
4576 if (aurApp->GetRemoveMode())
4577 return;
4578
4579 Unit* caster = aura->GetCaster();
4580
4581 // Update target aura state flag
4582 SpellInfo const* spellInfo = aura->GetSpellInfo();
4583 if (AuraStateType aState = spellInfo->GetAuraState())
4584 {
4585 uint32 aStateMask = (1 << (aState - 1));
4586 // force update so the new caster registers it
4587 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) && HasFlag(UNIT_FIELD_AURASTATE, aStateMask))
4589 else
4590 ModifyAuraState(aState, true);
4591 }
4592
4593 if (aurApp->GetRemoveMode())
4594 return;
4595
4596 // Sitdown on apply aura req seated
4599
4600 if (aurApp->GetRemoveMode())
4601 return;
4602
4603 aura->HandleAuraSpecificMods(aurApp, caster, true, false);
4604
4605 // apply effects of the aura
4606 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4607 {
4608 if (effMask & 1 << i && (!aurApp->GetRemoveMode()))
4609 aurApp->_HandleEffect(i, true);
4610 }
4611
4612 sScriptMgr->OnAuraApply(this, aura);
4613}
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition: SpellDefines.h:61
@ UNIT_FIELD_AURASTATE
Definition: UpdateFields.h:119
@ UNIT_STAND_STATE_SIT
Definition: UnitDefines.h:33
#define sScriptMgr
Definition: ScriptMgr.h:728
#define PER_CASTER_AURA_STATE_MASK
Definition: SharedDefines.h:1329
AuraStateType
Definition: SharedDefines.h:1299
#define MAX_SPELL_EFFECTS
Definition: DBCStructure.h:1638
std::uint32_t uint32
Definition: Define.h:107
bool HasFlag(uint16 index, uint32 flag) const
Definition: Object.cpp:878
void ForceValuesUpdateAtIndex(uint32)
Definition: Object.cpp:2052
Definition: Unit.h:620
void ModifyAuraState(AuraStateType flag, bool apply)
Definition: Unit.cpp:10592
void SetStandState(uint8 state)
Definition: Unit.cpp:16809
bool IsSitState() const
Definition: Unit.cpp:16794
void _HandleEffect(uint8 effIndex, bool apply)
Definition: SpellAuras.cpp:161
Aura * GetBase() const
Definition: SpellAuras.h:62
AuraRemoveMode GetRemoveMode() const
Definition: SpellAuras.h:73
Definition: SpellAuras.h:87
Unit * GetCaster() const
Definition: SpellAuras.cpp:471
void HandleAuraSpecificMods(AuraApplication const *aurApp, Unit *caster, bool apply, bool onReapply)
Definition: SpellAuras.cpp:1265
Definition: SpellInfo.h:316
AuraStateType GetAuraState() const
Definition: SpellInfo.cpp:2071
uint32 AuraInterruptFlags
Definition: SpellInfo.h:353

References AuraApplication::_HandleEffect(), _RemoveNoStackAurasDueToAura(), AURA_INTERRUPT_FLAG_NOT_SEATED, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), Aura::HandleAuraSpecificMods(), Object::HasFlag(), IsSitState(), MAX_SPELL_EFFECTS, ModifyAuraState(), PER_CASTER_AURA_STATE_MASK, SetStandState(), sScriptMgr, UNIT_FIELD_AURASTATE, and UNIT_STAND_STATE_SIT.

Referenced by _ApplyAuraEffect().

◆ _ApplyAuraEffect()

void Unit::_ApplyAuraEffect ( Aura aura,
uint8  effIndex 
)
4557{
4558 ASSERT(aura);
4559 ASSERT(aura->HasEffect(effIndex));
4561 ASSERT(aurApp);
4562 if (!aurApp->GetEffectMask())
4563 _ApplyAura(aurApp, 1 << effIndex);
4564 else
4565 aurApp->_HandleEffect(effIndex, true);
4566}
void _ApplyAura(AuraApplication *aurApp, uint8 effMask)
Definition: Unit.cpp:4570
Definition: SpellAuras.h:37
uint8 GetEffectMask() const
Definition: SpellAuras.h:66
bool HasEffect(uint8 effIndex) const
Definition: SpellAuras.h:173
const AuraApplication * GetApplicationOfTarget(ObjectGuid guid) const
Definition: SpellAuras.h:183

References _ApplyAura(), AuraApplication::_HandleEffect(), ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetEffectMask(), Object::GetGUID(), and Aura::HasEffect().

◆ _CreateAuraApplication()

AuraApplication * Unit::_CreateAuraApplication ( Aura aura,
uint8  effMask 
)
4519{
4520 // can't apply aura on unit which is going to be deleted - to not create a memory leak
4522 // aura musn't be removed
4523 ASSERT(!aura->IsRemoved());
4524
4525 // aura mustn't be already applied on target
4526 ASSERT (!aura->IsAppliedOnTarget(GetGUID()) && "Unit::_CreateAuraApplication: aura musn't be applied on target");
4527
4528 SpellInfo const* aurSpellInfo = aura->GetSpellInfo();
4529 uint32 aurId = aurSpellInfo->Id;
4530
4531 // ghost spell check, allow apply any auras at player loading in ghost mode (will be cleanup after load)
4532 // Xinef: Added IsAllowingDeadTarget check
4533 if (!IsAlive() && !aurSpellInfo->IsDeathPersistent() && !aurSpellInfo->IsAllowingDeadTarget() && (!IsPlayer() || !ToPlayer()->GetSession()->PlayerLoading()))
4534 return nullptr;
4535
4536 Unit* caster = aura->GetCaster();
4537
4538 AuraApplication* aurApp = new AuraApplication(this, caster, aura, effMask);
4539 m_appliedAuras.insert(AuraApplicationMap::value_type(aurId, aurApp));
4540
4541 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4542 // xinef: even if it gets removed, it will be reapplied in a second
4543 if (aurSpellInfo->AuraInterruptFlags && this == aura->GetOwner())
4544 {
4545 m_interruptableAuras.push_back(aurApp);
4546 AddInterruptMask(aurSpellInfo->AuraInterruptFlags);
4547 }
4548
4549 if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState())
4550 m_auraStateAuras.insert(AuraStateAurasMap::value_type(aState, aurApp));
4551
4552 aura->_ApplyForTarget(this, caster, aurApp);
4553 return aurApp;
4554}
bool IsPlayer() const
Definition: Object.h:201
Player * ToPlayer()
Definition: Object.h:202
void AddInterruptMask(uint32 mask)
Definition: Unit.h:1525
bool IsAlive() const
Definition: Unit.h:1710
AuraApplicationList m_interruptableAuras
Definition: Unit.h:2091
AuraStateAurasMap m_auraStateAuras
Definition: Unit.h:2092
WorldObject * GetOwner() const
Definition: SpellAuras.h:107
bool IsAppliedOnTarget(ObjectGuid guid) const
Definition: SpellAuras.h:185
virtual void _ApplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition: SpellAuras.cpp:492
bool IsDeathPersistent() const
Definition: SpellInfo.cpp:1217
uint32 Id
Definition: SpellInfo.h:320
bool IsAllowingDeadTarget() const
Definition: SpellInfo.cpp:1227

References Aura::_ApplyForTarget(), AddInterruptMask(), ASSERT, SpellInfo::AuraInterruptFlags, SpellInfo::GetAuraState(), Aura::GetCaster(), Object::GetGUID(), Aura::GetOwner(), Aura::GetSpellInfo(), SpellInfo::Id, IsAlive(), SpellInfo::IsAllowingDeadTarget(), Aura::IsAppliedOnTarget(), SpellInfo::IsDeathPersistent(), Object::IsPlayer(), Aura::IsRemoved(), m_appliedAuras, m_auraStateAuras, m_cleanupDone, m_interruptableAuras, and Object::ToPlayer().

◆ _DeleteRemovedAuras()

void Unit::_DeleteRemovedAuras ( )
protected
3870{
3871 while (!m_removedAuras.empty())
3872 {
3873 delete m_removedAuras.front();
3874 m_removedAuras.pop_front();
3875 }
3876}

References m_removedAuras.

Referenced by _UpdateSpells(), and ~Unit().

◆ _EnterVehicle()

void Unit::_EnterVehicle ( Vehicle vehicle,
int8  seatId,
AuraApplication const *  aurApp = nullptr 
)
19485{
19486 // Must be called only from aura handler
19487 if (!IsAlive() || GetVehicleKit() == vehicle || vehicle->GetBase()->IsOnVehicle(this))
19488 return;
19489
19490 if (m_vehicle)
19491 {
19492 if (m_vehicle == vehicle)
19493 {
19494 if (seatId >= 0 && seatId != GetTransSeat())
19495 {
19496 LOG_DEBUG("vehicles", "EnterVehicle: {} leave vehicle {} seat {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), GetTransSeat(), seatId);
19497 ChangeSeat(seatId);
19498 }
19499
19500 return;
19501 }
19502 else
19503 {
19504 LOG_DEBUG("vehicles", "EnterVehicle: {} exit {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), vehicle->GetBase()->GetEntry());
19505 ExitVehicle();
19506 }
19507 }
19508
19509 if (!aurApp || aurApp->GetRemoveMode())
19510 return;
19511
19512 if (Player* player = ToPlayer())
19513 {
19514 if (vehicle->GetBase()->IsPlayer() && player->IsInCombat())
19515 return;
19516
19517 sScriptMgr->AnticheatSetUnderACKmount(player);
19518
19520 player->StopCastingCharm();
19521 player->StopCastingBindSight();
19522 Dismount();
19524
19525 // drop flag at invisible in bg
19526 if (Battleground* bg = player->GetBattleground())
19527 bg->EventPlayerDroppedFlag(player);
19528
19530 player->GetSession()->SendPacket(&data);
19531 }
19532
19533 ASSERT(!m_vehicle);
19534 m_vehicle = vehicle;
19535
19536 if (!m_vehicle->AddPassenger(this, seatId))
19537 {
19538 m_vehicle = nullptr;
19539 return;
19540 }
19541
19542 // Xinef: remove movement auras when entering vehicle (food buffs etc)
19544}
@ SPELL_AURA_MOUNTED
Definition: SpellAuraDefines.h:141
@ AURA_INTERRUPT_FLAG_MOVE
Definition: SpellDefines.h:46
@ AURA_INTERRUPT_FLAG_TURNING
Definition: SpellDefines.h:47
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:170
@ SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA
Definition: Opcodes.h:1211
Definition: Battleground.h:294
uint32 GetEntry() const
Definition: Object.h:116
int8 GetTransSeat() const
Definition: Object.h:689
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4185
void Dismount()
Definition: Unit.cpp:13618
bool IsOnVehicle(Unit const *vehicle) const
Definition: Unit.h:1843
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition: Unit.cpp:5175
void ChangeSeat(int8 seatId, bool next=true)
Definition: Unit.cpp:19546
Vehicle * GetVehicleKit() const
Definition: Unit.h:1841
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition: Unit.cpp:5246
void ExitVehicle(Position const *exitPosition=nullptr)
Definition: Unit.cpp:19565
Unit * GetBase() const
May be called from scripts.
Definition: Vehicle.h:37
bool AddPassenger(Unit *passenger, int8 seatId=-1)
Definition: Vehicle.cpp:318
Definition: WorldPacket.h:26

References Vehicle::AddPassenger(), ASSERT, AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, ChangeSeat(), Dismount(), ExitVehicle(), Vehicle::GetBase(), Object::GetEntry(), AuraApplication::GetRemoveMode(), WorldObject::GetTransSeat(), GetVehicleKit(), InterruptNonMeleeSpells(), IsAlive(), IsOnVehicle(), Object::IsPlayer(), LOG_DEBUG, m_vehicle, RemoveAurasByType(), RemoveAurasWithInterruptFlags(), SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SPELL_AURA_MOUNTED, sScriptMgr, and Object::ToPlayer().

Referenced by AuraEffect::HandleAuraControlVehicle().

◆ _ExitVehicle()

void Unit::_ExitVehicle ( Position const *  exitPosition = nullptr)
19603{
19604 if (!m_vehicle)
19605 return;
19606
19607 // This should be done before dismiss, because there may be some aura removal
19610
19611 Player* player = ToPlayer();
19612
19613 // If player is on mouted duel and exits the mount should immediatly lose the duel
19614 if (player && player->duel && player->duel->IsMounted)
19615 player->DuelComplete(DUEL_FLED);
19616
19617 Vehicle* vehicle = m_vehicle;
19618 Unit* vehicleBase = m_vehicle->GetBase();
19619 m_vehicle = nullptr;
19620
19621 if (!vehicleBase)
19622 return;
19623
19624 SetControlled(false, UNIT_STATE_ROOT); // SMSG_MOVE_FORCE_UNROOT, ~MOVEMENTFLAG_ROOT
19625
19626 Position pos;
19627 // If we ask for a specific exit position, use that one. Otherwise allow scripts to modify it
19628 if (exitPosition)
19629 pos = *exitPosition;
19630 else
19631 {
19632 // Set exit position to vehicle position and use the current orientation
19633 pos = vehicleBase->GetPosition(); // This should use passenger's current position, leaving it as it is now
19634 pos.SetOrientation(vehicleBase->GetOrientation());
19635
19636 // Change exit position based on seat entry addon data
19637 if (seatAddon)
19638 {
19639 if (seatAddon->ExitParameter == VehicleExitParameters::VehicleExitParamOffset)
19640 pos.RelocateOffset({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19641 else if (seatAddon->ExitParameter == VehicleExitParameters::VehicleExitParamDest)
19642 pos.Relocate({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19643 }
19644 }
19645
19647
19648 if (player)
19649 {
19651
19652 sScriptMgr->AnticheatSetUnderACKmount(player);
19653 }
19655 {
19657 data << GetPackGUID();
19658 SendMessageToSet(&data, false);
19659 }
19660
19661 // xinef: hack for flameleviathan seat vehicle
19662 VehicleEntry const* vehicleInfo = vehicle->GetVehicleInfo();
19663 if (!vehicleInfo || vehicleInfo->m_ID != 341)
19664 {
19665 Movement::MoveSplineInit init(this);
19666 init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
19667 init.SetFacing(vehicleBase->GetOrientation());
19668 init.SetTransportExit();
19669 init.Launch();
19670 }
19671 else
19672 {
19673 float o = pos.GetAngle(this);
19674 Movement::MoveSplineInit init(this);
19675 init.MoveTo(pos.GetPositionX() + 8 * cos(o), pos.GetPositionY() + 8 * std::sin(o), pos.GetPositionZ() + 16.0f);
19676 init.SetFacing(GetOrientation());
19677 init.SetTransportExit();
19678 init.Launch();
19679 DisableSpline();
19680 KnockbackFrom(pos.GetPositionX(), pos.GetPositionY(), 10.0f, 20.0f);
19682 }
19683
19684 // xinef: move fall, should we support all creatures that exited vehicle in air? Currently Quest Drag and Drop only, Air Assault quest
19685 if (IsCreature() && !CanFly() && vehicleInfo && (vehicleInfo->m_ID == 113 || vehicleInfo->m_ID == 8 || vehicleInfo->m_ID == 290 || vehicleInfo->m_ID == 298))
19686 {
19688 }
19689
19690 if ((!player || !(player->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT)) && vehicle->GetBase()->HasUnitTypeMask(UNIT_MASK_MINION))
19691 if (((Minion*)vehicleBase)->GetOwner() == this)
19692 {
19693 if (!vehicleInfo || vehicleInfo->m_ID != 349)
19694 {
19695 vehicle->Dismiss();
19696 }
19697 else if (vehicleBase->IsCreature())
19698 {
19699 vehicle->Uninstall();
19700 vehicleBase->m_Events.AddEvent(new VehicleDespawnEvent(*vehicleBase, 2000), vehicleBase->m_Events.CalculateTime(2000));
19701 }
19702
19703 // xinef: ugly hack, no appripriate hook later to cast spell
19704 if (player)
19705 {
19706 if (vehicleBase->GetEntry() == NPC_EIDOLON_WATCHER)
19707 player->CastSpell(player, VEHICLE_SPELL_SHADE_CONTROL_END, true);
19708 else if (vehicleBase->GetEntry() == NPC_LITHE_STALKER)
19709 player->CastSpell(player, VEHICLE_SPELL_GEIST_CONTROL_END, true);
19710 }
19711 }
19712
19714 {
19715 // Vehicle just died, we die too
19716 if (vehicleBase->getDeathState() == DeathState::JustDied)
19717 setDeathState(DeathState::JustDied);
19718 // If for other reason we as minion are exiting the vehicle (ejected, master dismounted) - unsummon
19719 else
19720 ToTempSummon()->UnSummon(2000); // Approximation
19721 }
19722
19723 if (player)
19724 {
19726 player->SetCanTeleport(true);
19727 }
19728}
@ VEHICLE_SPELL_PARACHUTE
Definition: VehicleDefines.h:53
@ VEHICLE_SPELL_SHADE_CONTROL_END
Definition: VehicleDefines.h:56
@ VEHICLE_SPELL_GEIST_CONTROL_END
Definition: VehicleDefines.h:55
@ NPC_EIDOLON_WATCHER
Definition: VehicleDefines.h:69
@ NPC_LITHE_STALKER
Definition: VehicleDefines.h:70
@ MOVEMENTFLAG_ROOT
Definition: UnitDefines.h:378
@ UNIT_MASK_ACCESSORY
Definition: UnitDefines.h:165
@ UNIT_MASK_MINION
Definition: UnitDefines.h:157
@ UNIT_STATE_ROOT
Definition: UnitDefines.h:180
@ UNIT_STATE_MOVE
Definition: UnitDefines.h:189
@ DELAYED_VEHICLE_TELEPORT
Definition: Player.h:905
@ DUEL_FLED
Definition: SharedDefines.h:3880
@ SMSG_SPLINE_MOVE_UNROOT
Definition: Opcodes.h:802
Seconds GetGameTime()
Definition: GameTime.cpp:38
void AddEvent(BasicEvent *Event, uint64 e_time, bool set_addtime=true)
Definition: EventProcessor.h:103
uint64 CalculateTime(uint64 t_offset) const
Definition: EventProcessor.cpp:159
virtual void UnSummon(uint32 msTime=0)
Definition: TemporarySummon.cpp:287
Definition: TemporarySummon.h:77
PackedGuid const & GetPackGUID() const
Definition: Object.h:115
bool IsCreature() const
Definition: Object.h:205
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
Definition: Object.cpp:2065
EventProcessor m_Events
Definition: Object.h:731
Definition: Position.h:27
void RelocateOffset(const Position &offset)
Definition: Position.cpp:66
float GetPositionZ() const
Definition: Position.h:123
float GetOrientation() const
Definition: Position.h:124
void SetOrientation(float orientation)
Definition: Position.h:116
float GetPositionX() const
Definition: Position.h:121
void GetPosition(float &x, float &y) const
Definition: Position.h:126
float GetPositionY() const
Definition: Position.h:122
float GetAngle(const Position *pos) const
Definition: Position.cpp:85
void SetCanTeleport(bool value)
Definition: Player.h:2501
void DuelComplete(DuelCompleteType type)
Definition: Player.cpp:6453
void SetFallInformation(uint32 time, float z)
Definition: Player.h:2340
std::unique_ptr< DuelInfo > duel
Definition: Player.h:1873
void ResummonPetTemporaryUnSummonedIfAny()
Definition: Player.cpp:14259
uint32 GetDelayedOperations() const
Definition: Player.h:2098
virtual void setDeathState(DeathState s, bool despawn=false)
Definition: Unit.cpp:14654
Unit * GetOwner() const
Definition: Unit.cpp:10695
DeathState getDeathState()
Definition: Unit.h:1707
virtual bool CanFly() const =0
MotionMaster * GetMotionMaster()
Definition: Unit.h:1676
TempSummon * ToTempSummon()
Definition: Unit.h:686
void DisableSpline()
Definition: Unit.cpp:638
void AddUnitState(uint32 f)
Definition: Unit.h:690
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition: Unit.cpp:18131
bool HasUnitMovementFlag(uint32 f) const
Definition: Unit.h:729
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1194
uint32 HasUnitTypeMask(uint32 mask) const
Definition: Unit.h:696
void KnockbackFrom(float x, float y, float speedXY, float speedZ)
Definition: Unit.cpp:19240
Definition: Vehicle.h:28
void Dismiss()
Definition: Vehicle.cpp:539
VehicleEntry const * GetVehicleInfo() const
Definition: Vehicle.h:38
void RemovePassenger(Unit *passenger)
Definition: Vehicle.cpp:460
void Uninstall()
Definition: Vehicle.cpp:101
VehicleSeatAddon const * GetSeatAddonForSeatOfPassenger(Unit const *passenger) const
Definition: Vehicle.cpp:237
Definition: Vehicle.h:101
Definition: VehicleDefines.h:86
float ExitParameterO
Definition: VehicleDefines.h:96
float ExitParameterX
Definition: VehicleDefines.h:93
float ExitParameterY
Definition: VehicleDefines.h:94
float ExitParameterZ
Definition: VehicleDefines.h:95
VehicleExitParameters ExitParameter
Definition: VehicleDefines.h:97
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
The unit will fall. Used when in the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:662
Definition: MoveSplineInit.h:71
Definition: DBCStructure.h:2028
uint32 m_ID
Definition: DBCStructure.h:2029

References EventProcessor::AddEvent(), AddUnitState(), EventProcessor::CalculateTime(), CanFly(), CastSpell(), DELAYED_VEHICLE_TELEPORT, DisableSpline(), Vehicle::Dismiss(), Player::duel, DUEL_FLED, Player::DuelComplete(), VehicleSeatAddon::ExitParameter, VehicleSeatAddon::ExitParameterO, VehicleSeatAddon::ExitParameterX, VehicleSeatAddon::ExitParameterY, VehicleSeatAddon::ExitParameterZ, Position::GetAngle(), Vehicle::GetBase(), getDeathState(), Player::GetDelayedOperations(), Object::GetEntry(), GameTime::GetGameTime(), GetMotionMaster(), Position::GetOrientation(), GetOwner(), Object::GetPackGUID(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Vehicle::GetSeatAddonForSeatOfPassenger(), Vehicle::GetVehicleInfo(), HasUnitMovementFlag(), HasUnitTypeMask(), Object::IsCreature(), KnockbackFrom(), Movement::MoveSplineInit::Launch(), WorldObject::m_Events, VehicleEntry::m_ID, m_vehicle, MotionMaster::MoveFall(), MOVEMENTFLAG_ROOT, Movement::MoveSplineInit::MoveTo(), NPC_EIDOLON_WATCHER, NPC_LITHE_STALKER, Position::Relocate(), Position::RelocateOffset(), Vehicle::RemovePassenger(), Player::ResummonPetTemporaryUnSummonedIfAny(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), SetControlled(), setDeathState(), Movement::MoveSplineInit::SetFacing(), Player::SetFallInformation(), Position::SetOrientation(), Movement::MoveSplineInit::SetTransportExit(), SMSG_SPLINE_MOVE_UNROOT, sScriptMgr, Object::ToPlayer(), ToTempSummon(), Vehicle::Uninstall(), UNIT_MASK_ACCESSORY, UNIT_MASK_MINION, UNIT_STATE_MOVE, UNIT_STATE_ROOT, TempSummon::UnSummon(), VEHICLE_SPELL_GEIST_CONTROL_END, VEHICLE_SPELL_PARACHUTE, and VEHICLE_SPELL_SHADE_CONTROL_END.

Referenced by AuraEffect::HandleAuraControlVehicle(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ _IsNoStackAuraDueToAura()

bool Unit::_IsNoStackAuraDueToAura ( Aura appliedAura,
Aura existingAura 
) const

◆ _IsValidAssistTarget()

bool Unit::_IsValidAssistTarget ( Unit const *  target,
SpellInfo const *  bySpell 
) const
14102{
14103 ASSERT(target);
14104
14105 // can assist to self
14106 if (this == target)
14107 return true;
14108
14109 // can't assist unattackable units or GMs
14110 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
14111 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
14112 return false;
14113
14114 // can't assist own vehicle or passenger
14115 if (m_vehicle)
14116 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
14117 return false;
14118
14119 // can't assist invisible
14120 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))
14121 return false;
14122
14123 // can't assist dead
14124 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
14125 return false;
14126
14127 // can't assist untargetable
14128 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
14129 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
14130 return false;
14131
14132 if (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14133 {
14134 // xinef: do not allow to assist non attackable units
14135 if (target->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE))
14136 return false;
14137
14139 {
14140 if (target->IsImmuneToPC())
14141 return false;
14142 }
14143 else
14144 {
14145 if (target->IsImmuneToNPC())
14146 return false;
14147 }
14148 }
14149
14150 // can't assist non-friendly targets
14151 if (GetReactionTo(target) < REP_NEUTRAL
14152 && target->GetReactionTo(this) < REP_NEUTRAL
14153 && (!ToCreature() || !(ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)))
14154 return false;
14155
14156 // PvP case
14157 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
14158 {
14159 Player const* targetPlayerOwner = target->GetAffectingPlayer();
14161 {
14162 Player const* selfPlayerOwner = GetAffectingPlayer();
14163 if (selfPlayerOwner && targetPlayerOwner)
14164 {
14165 // can't assist player which is dueling someone
14166 if (selfPlayerOwner != targetPlayerOwner
14167 && targetPlayerOwner->duel)
14168 return false;
14169 }
14170 // can't assist player in ffa_pvp zone from outside
14171 if (target->IsFFAPvP() && !IsFFAPvP())
14172 return false;
14173
14174 // can't assist player out of sanctuary from sanctuary if has pvp enabled
14175 if (target->IsPvP())
14176 if (IsInSanctuary() && !target->IsInSanctuary())
14177 return false;
14178 }
14179 }
14180 // PvC case - player can assist creature only if has specific type flags
14181 // !target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) &&
14183 && (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14184 && !target->IsPvP())
14185 {
14186 if (Creature const* creatureTarget = target->ToCreature())
14187 return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST;
14188 }
14189 return true;
14190}
@ UNIT_STATE_UNATTACKABLE
Definition: UnitDefines.h:209
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:253
@ UNIT_FLAG_NOT_SELECTABLE
Definition: UnitDefines.h:277
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition: UnitDefines.h:255
@ REP_NEUTRAL
Definition: SharedDefines.h:183
@ CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT
Definition: SharedDefines.h:2732
@ CREATURE_TYPE_FLAG_CAN_ASSIST
Definition: SharedDefines.h:2718
@ SPELL_ATTR6_CAN_TARGET_UNTARGETABLE
Definition: SharedDefines.h:639
@ SPELL_ATTR6_IGNORE_PHASE_SHIFT
Definition: SharedDefines.h:628
@ SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC
Definition: SharedDefines.h:618
Definition: Creature.h:43
Creature * ToCreature()
Definition: Object.h:206
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition: Object.cpp:1705
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition: Unit.cpp:10134
bool HasUnitFlag(UnitFlags flags) const
Definition: Unit.h:702
bool IsInSanctuary() const
Definition: Unit.h:984
bool IsFFAPvP() const
Definition: Unit.h:986
Player * GetAffectingPlayer() const
Definition: Unit.cpp:10720

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_CAN_ASSIST, CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, GetAffectingPlayer(), Vehicle::GetBase(), GetReactionTo(), SpellInfo::HasAttribute(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), IsFFAPvP(), Player::IsGameMaster(), IsImmuneToNPC(), IsImmuneToPC(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), m_vehicle, REP_NEUTRAL, SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_STATE_UNATTACKABLE.

Referenced by SpellInfo::CheckExplicitTarget(), IsValidAssistTarget(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _IsValidAttackTarget()

bool Unit::_IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell,
WorldObject const *  obj = nullptr 
) const
13979{
13980 ASSERT(target);
13981
13982 // can't attack self
13983 if (this == target)
13984 return false;
13985
13986 // can't attack unattackable units or GMs
13987 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
13988 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
13989 return false;
13990
13991 // can't attack own vehicle or passenger
13992 if (m_vehicle)
13993 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
13994 if (!IsHostileTo(target)) // pussywizard: actually can attack own vehicle or passenger if it's hostile to us - needed for snobold in Gormok encounter
13995 return false;
13996
13997 // can't attack invisible (ignore stealth for aoe spells) also if the area being looked at is from a spell use the dynamic object created instead of the casting unit.
13998 //Ignore stealth if target is player and unit in combat with same player
13999 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()) : !CanSeeOrDetect(target, (bySpell && bySpell->IsAffectingArea()) || (target->IsPlayer() && target->HasStealthAura() && target->IsInCombat() && IsInCombatWith(target)))))
14000 return false;
14001
14002 // can't attack dead
14003 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
14004 return false;
14005
14006 // can't attack untargetable
14007 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
14008 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
14009 return false;
14010
14011 if (Player const* playerAttacker = ToPlayer())
14012 {
14013 if (playerAttacker->HasPlayerFlag(PLAYER_FLAGS_UBER) || playerAttacker->IsSpectator())
14014 return false;
14015 }
14016 // check flags
14018 || (!HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToNPC())
14019 || (!target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToNPC())
14020 || (HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToPC())
14021 // check if this is a world trigger cast - GOs are using world triggers to cast their spells, so we need to ignore their immunity flag here, this is a temp workaround, needs removal when go cast is implemented properly
14022 || ((GetEntry() != WORLD_TRIGGER && (!obj || !obj->isType(TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT))) && target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToPC()))
14023 return false;
14024
14025 // CvC case - can attack each other only when one of them is hostile
14027 return GetReactionTo(target) <= REP_HOSTILE || target->GetReactionTo(this) <= REP_HOSTILE;
14028
14029 // PvP, PvC, CvP case
14030 // can't attack friendly targets
14031 ReputationRank repThisToTarget = GetReactionTo(target);
14032 ReputationRank repTargetToThis;
14033
14034 if (repThisToTarget > REP_NEUTRAL
14035 || (repTargetToThis = target->GetReactionTo(this)) > REP_NEUTRAL)
14036 return false;
14037
14038 // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar)
14039 if (repThisToTarget == REP_NEUTRAL &&
14040 repTargetToThis <= REP_NEUTRAL)
14041 {
14042 Player* owner = GetAffectingPlayer();
14043 Unit const* const thisUnit = owner ? owner : this;
14044 if (!(target->IsPlayer() && thisUnit->IsPlayer()) &&
14045 !(target->IsCreature() && thisUnit->IsCreature()))
14046 {
14047 Player const* player = target->IsPlayer() ? target->ToPlayer() : thisUnit->ToPlayer();
14048 Unit const* creature = target->IsCreature() ? target : thisUnit;
14049
14050 if (FactionTemplateEntry const* factionTemplate = creature->GetFactionTemplateEntry())
14051 {
14052 if (!(player->GetReputationMgr().GetForcedRankIfAny(factionTemplate)))
14053 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplate->faction))
14054 if (FactionState const* repState = player->GetReputationMgr().GetState(factionEntry))
14055 if (!(repState->Flags & FACTION_FLAG_AT_WAR))
14056 return false;
14057 }
14058 }
14059 }
14060
14061 Creature const* creatureAttacker = ToCreature();
14062 if (creatureAttacker && creatureAttacker->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)
14063 return false;
14064
14065 Player const* playerAffectingAttacker = HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? GetAffectingPlayer() : nullptr;
14066 Player const* playerAffectingTarget = target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? target->GetAffectingPlayer() : nullptr;
14067
14068 // check duel - before sanctuary checks
14069 if (playerAffectingAttacker && playerAffectingTarget)
14070 if (playerAffectingAttacker->duel && playerAffectingAttacker->duel->Opponent == playerAffectingTarget && playerAffectingAttacker->duel->State == DUEL_STATE_IN_PROGRESS)
14071 return true;
14072
14073 // PvP case - can't attack when attacker or target are in sanctuary
14074 // however, 13850 client doesn't allow to attack when one of the unit's has sanctuary flag and is pvp
14075 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && (target->IsInSanctuary() || IsInSanctuary()))
14076 return false;
14077
14078 // additional checks - only PvP case
14079 if (playerAffectingAttacker && playerAffectingTarget)
14080 {
14081 if (!IsPvP() && bySpell && bySpell->IsAffectingArea() && !bySpell->HasAttribute(SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK))
14082 return false;
14083
14084 if (target->IsPvP())
14085 return true;
14086
14087 if (IsFFAPvP() && target->IsFFAPvP())
14088 return true;
14089
14091 }
14092 return true;
14093}
@ UNIT_FIELD_BYTES_2
Definition: UpdateFields.h:161
@ TYPEMASK_DYNAMICOBJECT
Definition: ObjectGuid.h:52
@ TYPEMASK_GAMEOBJECT
Definition: ObjectGuid.h:51
@ UNIT_BYTE2_FLAG_UNK1
Definition: UnitDefines.h:137
@ UNIT_FLAG_TAXI_FLIGHT
Definition: UnitDefines.h:272
@ UNIT_FLAG_NON_ATTACKABLE_2
Definition: UnitDefines.h:268
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition: UnitDefines.h:259
#define WORLD_TRIGGER
Definition: Unit.h:38
@ DUEL_STATE_IN_PROGRESS
Definition: Player.h:367
@ PLAYER_FLAGS_UBER
Definition: Player.h:488
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
@ SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK
Definition: SharedDefines.h:584
ReputationRank
Definition: SharedDefines.h:179
@ REP_HOSTILE
Definition: SharedDefines.h:181
@ FACTION_FLAG_AT_WAR
Definition: DBCEnums.h:308
CreatureTemplate const * GetCreatureTemplate() const
Definition: Creature.h:209
uint32 type_flags
Definition: CreatureData.h:223
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition: Object.cpp:938
ReputationMgr & GetReputationMgr()
Definition: Player.h:2125
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition: Unit.cpp:10104
bool IsPvP() const
Definition: Unit.h:985
bool IsInCombatWith(Unit const *who) const
Definition: Unit.cpp:20898
bool IsImmuneToNPC() const
Definition: Unit.h:876
bool IsHostileTo(Unit const *unit) const
Definition: Unit.cpp:10306
bool IsImmuneToPC() const
Definition: Unit.h:874
Definition: ReputationMgr.h:41
FactionState const * GetState(FactionEntry const *factionEntry) const
Definition: ReputationMgr.h:81
ReputationRank const * GetForcedRankIfAny(FactionTemplateEntry const *factionTemplateEntry) const
Definition: ReputationMgr.h:106
Definition: DBCStructure.h:907
Definition: DBCStructure.h:939

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_FLAG_AT_WAR, GetAffectingPlayer(), Vehicle::GetBase(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetReactionTo(), Player::GetReputationMgr(), ReputationMgr::GetState(), SpellInfo::HasAttribute(), Object::HasByteFlag(), HasStealthAura(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), Object::IsCreature(), IsFFAPvP(), Player::IsGameMaster(), IsHostileTo(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsInCombatWith(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), Object::isType(), m_vehicle, PLAYER_FLAGS_UBER, REP_HOSTILE, REP_NEUTRAL, sFactionStore, SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), CreatureTemplate::type_flags, TYPEMASK_DYNAMICOBJECT, TYPEMASK_GAMEOBJECT, UNIT_BYTE2_FLAG_UNK1, UNIT_FIELD_BYTES_2, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NON_ATTACKABLE_2, UNIT_FLAG_NOT_ATTACKABLE_1, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_TAXI_FLIGHT, UNIT_STATE_UNATTACKABLE, and WORLD_TRIGGER.

Referenced by SpellInfo::CheckExplicitTarget(), Spell::DoSpellHitOnUnit(), GetMagicHitRedirectTarget(), GetMeleeHitRedirectTarget(), IsValidAttackTarget(), Acore::AnyAoETargetUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _RegisterAuraEffect()

void Unit::_RegisterAuraEffect ( AuraEffect aurEff,
bool  apply 
)
4762{
4763 if (apply)
4764 m_modAuras[aurEff->GetAuraType()].push_back(aurEff);
4765 else
4766 m_modAuras[aurEff->GetAuraType()].erase(std::remove(m_modAuras[aurEff->GetAuraType()].begin(), m_modAuras[aurEff->GetAuraType()].end(), aurEff), m_modAuras[aurEff->GetAuraType()].end());
4767}
AuraEffectList m_modAuras[TOTAL_AURAS]
Definition: Unit.h:2089
AuraType GetAuraType() const
Definition: SpellAuraEffects.cpp:448

References AuraEffect::GetAuraType(), and m_modAuras.

Referenced by AuraEffect::HandleEffect().

◆ _RegisterDynObject()

void Unit::_RegisterDynObject ( DynamicObject dynObj)
6215{
6216 m_dynObj.push_back(dynObj);
6217}

References m_dynObj.

Referenced by DynamicObject::BindToCaster().

◆ _RemoveAllAuraStatMods()

void Unit::_RemoveAllAuraStatMods ( )
5548{
5549 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5550 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, false);
5551}

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_RemoveAllStatBonuses().

◆ _removeAttacker()

void Unit::_removeAttacker ( Unit pAttacker)
inlineprivate
Note
: Call only in Unit::Attack()
2148{ m_attackers.erase(pAttacker); }

References m_attackers.

Referenced by Attack(), and AttackStop().

◆ _RemoveNoStackAuraApplicationsDueToAura()

void Unit::_RemoveNoStackAuraApplicationsDueToAura ( Aura aura)

◆ _RemoveNoStackAurasDueToAura()

void Unit::_RemoveNoStackAurasDueToAura ( Aura aura)
4733{
4734 //SpellInfo const* spellProto = aura->GetSpellInfo();
4735
4736 // passive spell special case (only non stackable with ranks)
4737
4738 // xinef: this check makes caster to have 2 area auras thanks to spec switch
4739 // if (spellProto->IsPassiveStackableWithRanks())
4740 // return;
4741
4742 bool remove = false;
4743 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
4744 {
4745 if (remove)
4746 {
4747 remove = false;
4748 i = m_appliedAuras.begin();
4749 }
4750
4751 if (aura->CanStackWith(i->second->GetBase(), true))
4752 continue;
4753
4755 if (i == m_appliedAuras.end())
4756 break;
4757 remove = true;
4758 }
4759}
@ AURA_REMOVE_BY_DEFAULT
Definition: SpellAuraDefines.h:392
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4841
bool CanStackWith(Aura const *checkAura, bool remove) const
Definition: SpellAuras.cpp:2021

References AURA_REMOVE_BY_DEFAULT, Aura::CanStackWith(), m_appliedAuras, and RemoveAura().

Referenced by _AddAura(), and _ApplyAura().

◆ _TryStackingOrRefreshingExistingAura()

Aura * Unit::_TryStackingOrRefreshingExistingAura ( SpellInfo const *  newAura,
uint8  effMask,
Unit caster,
int32 baseAmount = nullptr,
Item castItem = nullptr,
ObjectGuid  casterGUID = ObjectGuid::Empty,
bool  periodicReset = false 
)
4420{
4421 ASSERT(casterGUID || caster);
4422 if (!casterGUID)
4423 casterGUID = caster->GetGUID();
4424
4425 // Xinef: Hax for mixology, best solution qq
4426 if (sSpellMgr->GetSpellGroup(newAura->Id) == 1)
4427 return nullptr;
4428
4429 // passive and Incanter's Absorption and auras with different type can stack with themselves any number of times
4430 if (!newAura->IsMultiSlotAura())
4431 {
4432 // check if cast item changed
4433 ObjectGuid castItemGUID;
4434 if (castItem)
4435 castItemGUID = castItem->GetGUID();
4436
4437 // find current aura from spell and change it's stackamount, or refresh it's duration
4438 if (Aura* foundAura = GetOwnedAura(newAura->Id, newAura->HasAttribute(SPELL_ATTR0_CU_SINGLE_AURA_STACK) ? ObjectGuid::Empty : casterGUID, newAura->HasAttribute(SPELL_ATTR0_CU_ENCHANT_PROC) ? castItemGUID : ObjectGuid::Empty, 0))
4439 {
4440 // effect masks do not match
4441 // extremely rare case
4442 // let's just recreate aura
4443 if (effMask != foundAura->GetEffectMask())
4444 return nullptr;
4445
4446 // update basepoints with new values - effect amount will be recalculated in ModStackAmount
4447 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4448 {
4449 if (!foundAura->HasEffect(i))
4450 continue;
4451
4452 int bp;
4453 if (baseAmount)
4454 bp = *(baseAmount + i);
4455 else
4456 bp = foundAura->GetSpellInfo()->Effects[i].BasePoints;
4457
4458 int32* oldBP = const_cast<int32*>(&(foundAura->GetEffect(i)->m_baseAmount));
4459 *oldBP = bp;
4460 }
4461
4462 // correct cast item guid if needed
4463 if (castItemGUID != foundAura->GetCastItemGUID())
4464 {
4465 ObjectGuid* oldGUID = const_cast<ObjectGuid*>(&foundAura->m_castItemGuid);
4466 *oldGUID = castItemGUID;
4467 }
4468
4469 // try to increase stack amount
4470 foundAura->ModStackAmount(1, AURA_REMOVE_BY_DEFAULT, periodicReset);
4471 sScriptMgr->OnAuraApply(this, foundAura);
4472 return foundAura;
4473 }
4474 }
4475
4476 return nullptr;
4477}
@ SPELL_ATTR0_CU_ENCHANT_PROC
Definition: SpellInfo.h:176
@ SPELL_ATTR0_CU_SINGLE_AURA_STACK
Definition: SpellInfo.h:198
#define sSpellMgr
Definition: SpellMgr.h:825
std::int32_t int32
Definition: Define.h:103
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:113
Definition: ObjectGuid.h:118
static ObjectGuid const Empty
Definition: ObjectGuid.h:120
Aura * GetOwnedAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
Definition: Unit.cpp:4825

References ASSERT, AURA_REMOVE_BY_DEFAULT, ObjectGuid::Empty, Object::GetGUID(), GetOwnedAura(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsMultiSlotAura(), MAX_SPELL_EFFECTS, SPELL_ATTR0_CU_ENCHANT_PROC, SPELL_ATTR0_CU_SINGLE_AURA_STACK, sScriptMgr, and sSpellMgr.

Referenced by Aura::TryRefreshStackOrCreate().

◆ _UnapplyAura() [1/2]

void Unit::_UnapplyAura ( AuraApplication aurApp,
AuraRemoveMode  removeMode 
)
4712{
4713 // aura can be removed from unit only if it's applied on it, shouldn't happen
4714 ASSERT(aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) == aurApp);
4715
4716 uint32 spellId = aurApp->GetBase()->GetId();
4717 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4718
4719 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4720 {
4721 if (iter->second == aurApp)
4722 {
4723 _UnapplyAura(iter, removeMode);
4724 return;
4725 }
4726 else
4727 ++iter;
4728 }
4729 ABORT();
4730}
#define ABORT
Definition: Errors.h:76
std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
Definition: Unit.h:631
void _UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
Definition: Unit.cpp:4616

References _UnapplyAura(), ABORT, ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), and m_appliedAuras.

◆ _UnapplyAura() [2/2]

void Unit::_UnapplyAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  removeMode 
)
4617{
4618 AuraApplication* aurApp = i->second;
4619 ASSERT(aurApp);
4620 ASSERT(!aurApp->GetRemoveMode());
4621 ASSERT(aurApp->GetTarget() == this);
4622
4623 aurApp->SetRemoveMode(removeMode);
4624 Aura* aura = aurApp->GetBase();
4625 LOG_DEBUG("spells.aura", "Aura {} now is remove mode {}", aura->GetId(), removeMode);
4626
4627 // dead loop is killing the server probably
4628 ASSERT(m_removedAurasCount < 0xFFFFFFFF);
4629
4631
4632 Unit* caster = aura->GetCaster();
4633
4634 // Remove all pointers from lists here to prevent possible pointer invalidation on spellcast/auraapply/auraremove
4635 m_appliedAuras.erase(i);
4636
4637 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4638 // xinef: event if it gets removed, it will be reapplied in a second
4639 if (aura->GetSpellInfo()->AuraInterruptFlags && this == aura->GetOwner())
4640 {
4641 m_interruptableAuras.remove(aurApp);
4643 }
4644
4645 bool auraStateFound = false;
4646 AuraStateType auraState = aura->GetSpellInfo()->GetAuraState();
4647 if (auraState)
4648 {
4649 bool canBreak = false;
4650 // Get mask of all aurastates from remaining auras
4651 for (AuraStateAurasMap::iterator itr = m_auraStateAuras.lower_bound(auraState); itr != m_auraStateAuras.upper_bound(auraState) && !(auraStateFound && canBreak);)
4652 {
4653 if (itr->second == aurApp)
4654 {
4655 m_auraStateAuras.erase(itr);
4656 itr = m_auraStateAuras.lower_bound(auraState);
4657 canBreak = true;
4658 continue;
4659 }
4660 auraStateFound = true;
4661 ++itr;
4662 }
4663 }
4664
4665 aurApp->_Remove();
4666 aura->_UnapplyForTarget(this, caster, aurApp);
4667
4668 // remove effects of the spell - needs to be done after removing aura from lists
4669 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4670 {
4671 if (aurApp->HasEffect(itr))
4672 aurApp->_HandleEffect(itr, false);
4673 }
4674
4675 // all effect mustn't be applied
4676 ASSERT(!aurApp->GetEffectMask());
4677
4678 // Remove totem at next update if totem loses its aura
4679 if (aurApp->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE && IsTotem() && GetGUID() == aura->GetCasterGUID())
4680 {
4681 if (ToTotem()->GetSpell() == aura->GetId() && ToTotem()->GetTotemType() == TOTEM_PASSIVE)
4682 ToTotem()->setDeathState(DeathState::JustDied);
4683 }
4684
4685 // Remove aurastates only if needed and were not found
4686 if (auraState)
4687 {
4688 if (!auraStateFound)
4689 ModifyAuraState(auraState, false);
4690 else
4691 {
4692 // update for casters, some shouldn't 'see' the aura state
4693 uint32 aStateMask = (1 << (auraState - 1));
4694 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) != 0)
4696 }
4697 }
4698
4699 aura->HandleAuraSpecificMods(aurApp, caster, false, false);
4700
4701 // only way correctly remove all auras from list
4702 //if (removedAuras != m_removedAurasCount) new aura may be added
4703 i = m_appliedAuras.begin();
4704
4705 sScriptMgr->OnAuraRemove(this, aurApp, removeMode);
4706
4707 if (this->ToCreature() && this->ToCreature()->IsAIEnabled)
4708 this->ToCreature()->AI()->OnAuraRemove(aurApp, removeMode);
4709}
@ AURA_REMOVE_BY_EXPIRE
Definition: SpellAuraDefines.h:395
@ TOTEM_PASSIVE
Definition: Totem.h:25
virtual void OnAuraRemove(AuraApplication *, AuraRemoveMode)
Definition: CreatureAI.h:232
CreatureAI * AI() const
Definition: Creature.h:141
void setDeathState(DeathState s, bool despawn=false) override
A creature can be in 4 different states: Alive, JustDied, Corpse, and JustRespawned....
Definition: TemporarySummon.cpp:396
Totem * ToTotem()
Definition: Unit.h:685
void UpdateInterruptMask()
Definition: Unit.cpp:769
bool IsTotem() const
Definition: Unit.h:751
Unit * GetTarget() const
Definition: SpellAuras.h:61
void SetRemoveMode(AuraRemoveMode mode)
Definition: SpellAuras.h:72
void _Remove()
Definition: SpellAuras.cpp:94
bool HasEffect(uint8 effect) const
Definition: SpellAuras.h:67
virtual void _UnapplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition: SpellAuras.cpp:515

References AuraApplication::_HandleEffect(), AuraApplication::_Remove(), Aura::_UnapplyForTarget(), Creature::AI(), ASSERT, AURA_REMOVE_BY_EXPIRE, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), Aura::GetCasterGUID(), AuraApplication::GetEffectMask(), Object::GetGUID(), Aura::GetId(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), AuraApplication::GetTarget(), Aura::HandleAuraSpecificMods(), AuraApplication::HasEffect(), IsAIEnabled, IsTotem(), LOG_DEBUG, m_appliedAuras, m_auraStateAuras, m_interruptableAuras, m_removedAurasCount, MAX_SPELL_EFFECTS, ModifyAuraState(), CreatureAI::OnAuraRemove(), PER_CASTER_AURA_STATE_MASK, Minion::setDeathState(), AuraApplication::SetRemoveMode(), sScriptMgr, Object::ToCreature(), TOTEM_PASSIVE, ToTotem(), UNIT_FIELD_AURASTATE, and UpdateInterruptMask().

Referenced by Aura::_Remove(), _UnapplyAura(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAura(), and RemoveEvadeAuras().

◆ _UnregisterDynObject()

void Unit::_UnregisterDynObject ( DynamicObject dynObj)
6220{
6221 m_dynObj.remove(dynObj);
6222}

References m_dynObj.

Referenced by DynamicObject::UnbindFromCaster().

◆ _UpdateAutoRepeatSpell()

void Unit::_UpdateAutoRepeatSpell ( )
protected
3937{
3938 SpellInfo const* spellProto = nullptr;
3940 {
3942 }
3943
3944 if (!spellProto)
3945 {
3946 return;
3947 }
3948
3949 static uint32 const HUNTER_AUTOSHOOT = 75;
3950
3951 // Check "realtime" interrupts
3952 if ((IsPlayer() && ToPlayer()->isMoving() && spellProto->Id != HUNTER_AUTOSHOOT) || IsNonMeleeSpellCast(false, false, true, spellProto->Id == HUNTER_AUTOSHOOT))
3953 {
3954 // cancel wand shoot
3955 if (spellProto->Id != HUNTER_AUTOSHOOT)
3957 m_AutoRepeatFirstCast = true;
3958 return;
3959 }
3960
3961 // Apply delay (Hunter's autoshoot not affected)
3962 if (m_AutoRepeatFirstCast && getAttackTimer(RANGED_ATTACK) < 500 && spellProto->Id != HUNTER_AUTOSHOOT)
3963 {
3965 }
3966
3967 m_AutoRepeatFirstCast = false;
3968
3969 // Check for ranged attack timer
3971 {
3973 if (result != SPELL_CAST_OK)
3974 {
3975 if (spellProto->Id != HUNTER_AUTOSHOOT)
3976 {
3978 }
3979
3980 return;
3981 }
3982
3983 // We want to shoot
3984 Spell* spell = new Spell(this, spellProto, TRIGGERED_FULL_MASK);
3985 spell->prepare(&(m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_targets));
3986
3987 // Reset attack
3989 }
3990}
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
Definition: SpellDefines.h:150
@ CURRENT_AUTOREPEAT_SPELL
Definition: Unit.h:541
SpellCastResult
Definition: SharedDefines.h:959
@ SPELL_CAST_OK
Definition: SharedDefines.h:1149
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4113
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition: Unit.cpp:4155
void setAttackTimer(WeaponAttackType type, int32 time)
Definition: Unit.h:832
bool isMoving() const
Definition: Unit.h:1625
int32 getAttackTimer(WeaponAttackType type) const
Definition: Unit.h:834
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition: Unit.h:835
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition: Unit.cpp:644
Definition: Spell.h:295
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition: Spell.cpp:3391
SpellCastResult CheckCast(bool strict)
Definition: Spell.cpp:5592
SpellInfo const *const m_spellInfo
Definition: Spell.h:531

References Spell::CheckCast(), CURRENT_AUTOREPEAT_SPELL, getAttackTimer(), SpellInfo::Id, InterruptSpell(), isAttackReady(), isMoving(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_spellInfo, Spell::prepare(), RANGED_ATTACK, resetAttackTimer(), setAttackTimer(), SPELL_CAST_OK, Object::ToPlayer(), and TRIGGERED_FULL_MASK.

Referenced by _UpdateSpells().

◆ _UpdateSpells()

void Unit::_UpdateSpells ( uint32  time)
protected
3879{
3882
3883 // remove finished spells from current pointers
3884 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
3885 {
3886 if (m_currentSpells[i] && m_currentSpells[i]->getState() == SPELL_STATE_FINISHED)
3887 {
3889 m_currentSpells[i] = nullptr; // remove pointer
3890 }
3891 }
3892
3893 // m_auraUpdateIterator can be updated in indirect called code at aura remove to skip next planned to update but removed auras
3895 {
3896 Aura* i_aura = m_auraUpdateIterator->second;
3897 ++m_auraUpdateIterator; // need shift to next for allow update if need into aura update
3898 i_aura->UpdateOwner(time, this);
3899 }
3900
3901 // remove expired auras - do that after updates(used in scripts?)
3902 for (AuraMap::iterator i = m_ownedAuras.begin(); i != m_ownedAuras.end();)
3903 {
3904 if (i->second->IsExpired())
3906 else if (i->second->GetSpellInfo()->IsChanneled() && i->second->GetCasterGUID() != GetGUID() && !ObjectAccessor::GetWorldObject(*this, i->second->GetCasterGUID()))
3907 RemoveOwnedAura(i, AURA_REMOVE_BY_CANCEL); // remove channeled auras when caster is not on the same map
3908 else
3909 ++i;
3910 }
3911
3912 for (VisibleAuraMap::iterator itr = m_visibleAuras.begin(); itr != m_visibleAuras.end(); ++itr)
3913 if (itr->second->IsNeedClientUpdate())
3914 itr->second->ClientUpdate();
3915
3917
3918 if (!m_gameObj.empty())
3919 {
3920 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
3921 {
3922 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
3923 if (!go->isSpawned())
3924 {
3925 go->SetOwnerGUID(ObjectGuid::Empty);
3926 go->SetRespawnTime(0);
3927 go->Delete();
3928 m_gameObj.erase(itr++);
3929 continue;
3930 }
3931 ++itr;
3932 }
3933 }
3934}
@ AURA_REMOVE_BY_CANCEL
Definition: SpellAuraDefines.h:393
@ SPELL_STATE_FINISHED
Definition: Spell.h:237
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:184
WorldObject * GetWorldObject(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:115
Definition: GameObject.h:120
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4770
void _UpdateAutoRepeatSpell()
Definition: Unit.cpp:3936
VisibleAuraMap m_visibleAuras
Definition: Unit.h:2098
void UpdateOwner(uint32 diff, WorldObject *owner)
Definition: SpellAuras.cpp:756

References _DeleteRemovedAuras(), _UpdateAutoRepeatSpell(), AURA_REMOVE_BY_CANCEL, AURA_REMOVE_BY_EXPIRE, CURRENT_AUTOREPEAT_SPELL, CURRENT_MAX_SPELL, ObjectGuid::Empty, ObjectAccessor::GetGameObject(), Object::GetGUID(), ObjectAccessor::GetWorldObject(), m_auraUpdateIterator, m_currentSpells, m_gameObj, m_ownedAuras, m_visibleAuras, RemoveOwnedAura(), Spell::SetReferencedFromCurrent(), SPELL_STATE_FINISHED, and Aura::UpdateOwner().

Referenced by Update().

◆ AddAura() [1/2]

Aura * Unit::AddAura ( SpellInfo const *  spellInfo,
uint8  effMask,
Unit target 
)
18976{
18977 if (!spellInfo)
18978 return nullptr;
18979
18980 if (target->IsImmunedToSpell(spellInfo))
18981 return nullptr;
18982
18983 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
18984 {
18985 if (!(effMask & (1 << i)))
18986 continue;
18987 if (target->IsImmunedToSpellEffect(spellInfo, i))
18988 effMask &= ~(1 << i);
18989 }
18990
18991 if (Aura* aura = Aura::TryRefreshStackOrCreate(spellInfo, effMask, target, this))
18992 {
18993 aura->ApplyForTargets();
18994 return aura;
18995 }
18996 return nullptr;
18997}
virtual bool IsImmunedToSpellEffect(SpellInfo const *spellInfo, uint32 index) const
Definition: Unit.cpp:13100
virtual bool IsImmunedToSpell(SpellInfo const *spellInfo, Spell const *spell=nullptr)
Definition: Unit.cpp:13010
static Aura * TryRefreshStackOrCreate(SpellInfo const *spellproto, uint8 tryEffMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool *refresh=nullptr, bool periodicReset=false)
Definition: SpellAuras.cpp:326

References Aura::ApplyForTargets(), IsImmunedToSpell(), IsImmunedToSpellEffect(), MAX_SPELL_EFFECTS, and Aura::TryRefreshStackOrCreate().

◆ AddAura() [2/2]

Aura * Unit::AddAura ( uint32  spellId,
Unit target 
)
18961{
18962 if (!target)
18963 return nullptr;
18964
18965 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
18966 if (!spellInfo)
18967 return nullptr;
18968
18969 if (!target->IsAlive() && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_DEAD_TARGET))
18970 return nullptr;
18971
18972 return AddAura(spellInfo, MAX_EFFECT_MASK, target);
18973}
@ SPELL_ATTR2_ALLOW_DEAD_TARGET
Definition: SharedDefines.h:467
@ SPELL_ATTR0_PASSIVE
Definition: SharedDefines.h:399
#define MAX_EFFECT_MASK
Definition: DBCStructure.h:1639
Aura * AddAura(uint32 spellId, Unit *target)
Definition: Unit.cpp:18960
bool HasAttribute(SpellAttr0 attribute) const
Definition: SpellInfo.h:415

References AddAura(), SpellInfo::HasAttribute(), IsAlive(), MAX_EFFECT_MASK, SPELL_ATTR0_PASSIVE, SPELL_ATTR2_ALLOW_DEAD_TARGET, and sSpellMgr.

Referenced by AddAura(), boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), anonymous_namespace{GmVisibleCommandTest.cpp}::GmVisibleCommandTest::ApplyGmVisibleState(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_pet_dk_ebon_gargoyle::AttackStart(), boss_anzu::boss_anzu(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoTriggersOnSpellHit(), npc_anubisath_sentinel::aqsentinelAI::GainSentinelAbility(), AuraEffect::HandleAuraDummy(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterAdd(), gm_commandscript::HandleGMVisibleCommand(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_transitus_shield_beam_aura::HandleOnEffectApply(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_pallid_horror::InitializeAI(), Guardian::InitStatsForLevel(), boss_gahzranka::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_dalaran_warrior::npc_dalaran_warriorAI::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Creature::LoadCreaturesAddon(), npc_brew_bubble::MoveInLineOfSight(), npc_pet_gen_plump_turkey::MovementInform(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_empowered_aura::OnPeriodic(), instance_stratholme::instance_stratholme_InstanceMapScript::OnPlayerEnter(), BattlefieldWG::OnPlayerEnterZone(), AreaTrigger_at_area_52_entrance::OnTrigger(), Player::ProcessDelayedOperations(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_corrupted_totem::Reset(), npc_troll_volunteer::npc_troll_volunteerAI::Reset(), npc_vengeful_shade::npc_vengeful_shadeAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_magus_telestra::Reset(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_archavon::boss_archavonAI::Reset(), boss_emalon::boss_emalonAI::Reset(), boss_koralon::boss_koralonAI::Reset(), boss_toravon::boss_toravonAI::Reset(), npc_dalaran_mage::npc_dalaran_mageAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Player::SendInitialPacketsAfterAddToMap(), npc_corrupted_totem::SetAura(), SetAuraStack(), Player::SetGMVisible(), Player::SetIsSpectator(), npc_artorius::npc_artoriusAI::SpellHit(), npc_simone::npc_simoneAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::SpellHitTarget(), boss_netherspite::SwitchToPortalPhase(), boss_gyth::boss_gythAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), boss_netherspite::UpdatePortals(), and npc_emily::npc_emilyAI::WaypointReached().

◆ AddComboPointHolder()

void Unit::AddComboPointHolder ( Unit unit)
inline
964{ m_ComboPointHolders.insert(unit); }
std::unordered_set< Unit * > m_ComboPointHolders
Definition: Unit.h:2164

References m_ComboPointHolders.

Referenced by AddComboPoints().

◆ AddComboPoints() [1/2]

void Unit::AddComboPoints ( int8  count)
inline
961{ AddComboPoints(nullptr, count); }
void AddComboPoints(Unit *target, int8 count)
Definition: Unit.cpp:16921

References AddComboPoints().

Referenced by AddComboPoints().

◆ AddComboPoints() [2/2]

void Unit::AddComboPoints ( Unit target,
int8  count 
)
16922{
16923 if (!count)
16924 {
16925 return;
16926 }
16927
16928 if (target && target != m_comboTarget)
16929 {
16930 if (m_comboTarget)
16931 {
16933 }
16934
16935 m_comboTarget = target;
16936 m_comboPoints = count;
16937 target->AddComboPointHolder(this);
16938 }
16939 else
16940 {
16941 m_comboPoints = std::max<int8>(std::min<int8>(m_comboPoints + count, 5), 0);
16942 }
16943
16945}
void SendComboPoints()
Definition: Unit.cpp:16964
void AddComboPointHolder(Unit *unit)
Definition: Unit.h:964
void RemoveComboPointHolder(Unit *unit)
Definition: Unit.h:965

References AddComboPointHolder(), m_comboPoints, m_comboTarget, RemoveComboPointHolder(), and SendComboPoints().

Referenced by Spell::_handle_finish_phase(), AuraEffect::HandleAuraRetainComboPoints(), and ProcDamageAndSpellFor().

◆ AddExtraAttacks()

void Unit::AddExtraAttacks ( uint32  count)
2802{
2804 if (!targetGUID)
2805 {
2806 if (ObjectGuid selection = GetTarget())
2807 {
2808 targetGUID = selection; // Spell was cast directly (not triggered by aura)
2809 }
2810 else
2811 return;
2812 }
2813
2814 extraAttacksTargets[targetGUID] += count;
2815}
std::unordered_map< ObjectGuid, uint32 > extraAttacksTargets
Definition: Unit.h:2175
ObjectGuid _lastDamagedTargetGuid
Definition: Unit.h:2176
ObjectGuid GetTarget() const
Definition: Unit.h:813

References _lastDamagedTargetGuid, extraAttacksTargets, and GetTarget().

Referenced by Spell::EffectAddExtraAttacks().

◆ AddExtraUnitMovementFlag()

void Unit::AddExtraUnitMovementFlag ( uint16  f)
inline
733{ m_movementInfo.flags2 |= f; }
uint16 flags2
Definition: Object.h:292
MovementInfo m_movementInfo
Definition: Object.h:693

References MovementInfo::flags2, and WorldObject::m_movementInfo.

Referenced by Vehicle::InitMovementInfoForBase().

◆ addFollower()

void Unit::addFollower ( FollowerReference pRef)
inline
void insertFirst(LinkedListElement *pElem)
Definition: LinkedList.h:105
FollowerRefMgr m_FollowingRefMgr
Definition: Unit.h:2160

References LinkedListHead::insertFirst(), and m_FollowingRefMgr.

Referenced by FollowerReference::targetObjectBuildLink().

◆ AddGameObject()

void Unit::AddGameObject ( GameObject gameObj)
6276{
6277 if (!gameObj || gameObj->GetOwnerGUID())
6278 return;
6279
6280 m_gameObj.push_back(gameObj->GetGUID());
6281 gameObj->SetOwnerGUID(GetGUID());
6282
6283 if (IsPlayer() && gameObj->GetSpellId())
6284 {
6285 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(gameObj->GetSpellId());
6286 // Need disable spell use for owner
6287 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6288 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6289 ToPlayer()->AddSpellAndCategoryCooldowns(createBySpell, 0, nullptr, true);
6290 }
6291}
uint32 GetSpellId() const
Definition: GameObject.h:181
void SetOwnerGUID(ObjectGuid owner)
Definition: GameObject.h:163
ObjectGuid GetOwnerGUID() const
Definition: GameObject.h:173
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition: Player.cpp:10946
bool IsCooldownStartedOnEvent() const
Definition: SpellInfo.cpp:1212

References Player::AddSpellAndCategoryCooldowns(), Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, GameObject::SetOwnerGUID(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::EffectDuel(), Spell::EffectSummonObject(), Spell::EffectTransmitted(), npc_midsummer_bonfire::Ignite(), and WorldObject::SummonGameObject().

◆ addHatedBy()

void Unit::addHatedBy ( HostileReference pHostileReference)
inline

◆ AddInterruptMask()

void Unit::AddInterruptMask ( uint32  mask)
inline
1525{ m_interruptMask |= mask; }

References m_interruptMask.

Referenced by _CreateAuraApplication(), and Spell::handle_immediate().

◆ AddPetAura()

void Unit::AddPetAura ( PetAura const *  petSpell)
17381{
17382 if (!IsPlayer())
17383 return;
17384
17385 m_petAuras.insert(petSpell);
17386 if (Pet* pet = ToPlayer()->GetPet())
17387 pet->CastPetAura(petSpell);
17388 else if (Unit* charm = GetCharm())
17389 charm->CastPetAura(petSpell);
17390}
Pet * GetPet(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:215
Definition: Pet.h:41
Unit * GetCharm() const
Definition: Unit.cpp:10766
PetAuraSet m_petAuras
Definition: Unit.h:2013

References GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Spell::EffectDummy(), and AuraEffect::HandleAuraDummy().

◆ AddPlayerToVision()

void Unit::AddPlayerToVision ( Player player)
11265{
11266 if (m_sharedVision.empty())
11267 setActive(true);
11268
11269 m_sharedVision.push_back(player);
11270 player->m_isInSharedVisionOf.insert(this);
11271}
void setActive(bool isActiveObject)
Definition: Object.cpp:1065

References Player::m_isInSharedVisionOf, m_sharedVision, and WorldObject::setActive().

◆ AddPointedBy()

void Unit::AddPointedBy ( SafeUnitPointer sup)
inline
1937{ SafeUnitPointerSet.insert(sup); }
std::set< SafeUnitPointer * > SafeUnitPointerSet
Definition: Unit.h:2022

References SafeUnitPointerSet.

Referenced by SafeUnitPointer::SetPointedTo().

◆ AddSpellCooldown()

virtual void Unit::AddSpellCooldown ( uint32  ,
uint32  ,
uint32  ,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
inlinevirtual

◆ AddThreat()

void Unit::AddThreat ( Unit victim,
float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  threatSpell = nullptr 
)
14755{
14756 // Only mobs can manage threat lists
14758 {
14759 m_ThreatMgr.AddThreat(victim, fThreat, schoolMask, threatSpell);
14760 }
14761}
@ UNIT_STATE_EVADE
Definition: UnitDefines.h:191
void AddThreat(Unit *victim, float threat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition: ThreatMgr.cpp:436
bool HasUnitState(const uint32 f) const
Definition: Unit.h:691
bool CanHaveThreatList(bool skipAliveCheck=false) const
Definition: Unit.cpp:14715

References ThreatMgr::AddThreat(), CanHaveThreatList(), HasUnitState(), m_ThreatMgr, and UNIT_STATE_EVADE.

Referenced by Attack(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alythess::AttackStart(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::AttackStart(), npc_capernian::AttackStart(), npc_zuljin_vortex::ChangeToNewPlayer(), npc_dirt_mound::ChaseNewTarget(), boss_buru::ChaseNewVictim(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DamageTaken(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), DealDamage(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), CreatureAI::DoZoneInCombat(), Spell::EffectThreat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), npc_raging_flames::FixateRandomTarget(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), spell_morogrim_tidewalker_water_globule_new_target::HandleDummy(), HandleDummyAuraProc(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), AuraEffect::HandlePeriodicManaLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_the_lich_king_vile_spirit_move_target_search::HandleScript(), spell_pursue::HandleScript(), Spell::HandleThreatSpells(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_tiger_matriarch::npc_tiger_matriarchAI::IsSummonedBy(), npc_little_ooze::npc_little_oozeAI::IsSummonedBy(), npc_malchezaar_axe::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_buru::JustEngagedWith(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), boss_curator::JustSummoned(), boss_sacrolash::JustSummoned(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustSummoned(), npc_akama_illidan::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), boss_shade_of_akama::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_mage_mirror_image::MySelectNextTarget(), SmartScript::ProcessAction(), RemoveCharmedBy(), npc_dark_fiend::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), boss_skarvald_the_constructor::Reset(), boss_dalronn_the_controller::Reset(), npc_pet_hunter_snake_trap::Reset(), boss_romulo::ScheduleCombat(), npc_thaladred::ScheduleEvents(), boss_supremus::SchedulePhase(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_thrall_bfu::npc_thrall_bfuAI::SpawnWave(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), brann_bronzebeard::brann_bronzebeardAI::SummonCreatures(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), and npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI().

◆ AddToWorld()

void Unit::AddToWorld ( )
overridevirtual

Reimplemented from WorldObject.

15776{
15777 if (!IsInWorld())
15778 {
15780 }
15781}
void AddToWorld() override
Definition: Object.cpp:1175

References WorldObject::AddToWorld(), and Object::IsInWorld().

Referenced by Creature::AddToWorld(), Pet::AddToWorld(), and Player::AddToWorld().

◆ AddUnitMovementFlag()

◆ AddUnitState()

void Unit::AddUnitState ( uint32  f)
inline
690{ m_state |= f; }

References m_state.

Referenced by _ExitVehicle(), RandomMovementGenerator< T >::_setRandomLocation(), MotionTransport::AddPassenger(), Attack(), boss_prince_keleseth_icc::boss_prince_kelesethAI::boss_prince_kelesethAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::boss_prince_taldaramAI(), boss_prince_valanar_icc::boss_prince_valanarAI::boss_prince_valanarAI(), Creature::Create(), MotionTransport::CreateNPCPassenger(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), boss_nightbane::DoAction(), WaypointMovementGenerator< Creature >::DoInitialize(), RandomMovementGenerator< T >::DoInitialize(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoReset(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_jindo::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), Creature::FocusTarget(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetCastSpellOpcode(), RotateMovementGenerator::Initialize(), DistractMovementGenerator::Initialize(), npc_pet_dk_ebon_gargoyle::InitializeAI(), Player::LoadFromDB(), boss_ayamiss::MovementInform(), boss_lady_vashj::MovementInform(), npc_pet_gen_moth::npc_pet_gen_moth(), npc_pet_gen_valkyr_guardian::npc_pet_gen_valkyr_guardian(), npc_pet_gen_wind_rider_cub::npc_pet_gen_wind_rider_cub(), npc_corrupted_totem::Reset(), boss_jedoga_shadowseeker::Reset(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::Reset(), npc_wild_wyrm::npc_wild_wyrmAI::Reset(), boss_hungarfen::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), SetCharmedBy(), SmartAI::SetCombatMovement(), SetContestedPvP(), SetControlled(), SetCurrentCastedSpell(), Player::setDeathState(), Player::SetIsSpectator(), boss_urom::boss_uromAI::SpellHit(), WaypointMovementGenerator< Creature >::StartMove(), npc_madrigosa::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), and boss_svala::boss_svalaAI::UpdateAI().

◆ AddUnitTypeMask()

void Unit::AddUnitTypeMask ( uint32  mask)
inline
697{ m_unitTypeMask |= mask; }

References m_unitTypeMask.

◆ ApplyAttackTimePercentMod()

void Unit::ApplyAttackTimePercentMod ( WeaponAttackType  att,
float  val,
bool  apply 
)
17138{
17139 float remainingTimePct = std::max((float)m_attackTimer[att], 0.0f) / (GetAttackTime(att) * m_modAttackSpeedPct[att]);
17140 if (val > 0)
17141 {
17143 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, val, !apply);
17144 }
17145 else
17146 {
17148 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, -val, apply);
17149 }
17150 m_attackTimer[att] = uint32(GetAttackTime(att) * m_modAttackSpeedPct[att] * remainingTimePct);
17151}
@ UNIT_FIELD_BASEATTACKTIME
Definition: UpdateFields.h:120
std::uint16_t uint16
Definition: Define.h:108
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition: Util.h:50
void ApplyPercentModFloatValue(uint16 index, float val, bool apply)
Definition: Object.cpp:818
uint32 GetAttackTime(WeaponAttackType att) const
Definition: Unit.h:861

References Object::ApplyPercentModFloatValue(), ApplyPercentModFloatVar(), GetAttackTime(), m_attackTimer, m_modAttackSpeedPct, and UNIT_FIELD_BASEATTACKTIME.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleAuraModRangedHaste(), AuraEffect::HandleModAttackSpeed(), AuraEffect::HandleModCombatSpeedPct(), AuraEffect::HandleModMeleeRangedSpeedPct(), AuraEffect::HandleModMeleeSpeedPct(), and AuraEffect::HandleRangedAmmoHaste().

◆ ApplyCastTimePercentMod()

void Unit::ApplyCastTimePercentMod ( float  val,
bool  apply 
)
17154{
17155 if (val > 0)
17157 else
17159}
@ UNIT_MOD_CAST_SPEED
Definition: UpdateFields.h:137

References Object::ApplyPercentModFloatValue(), and UNIT_MOD_CAST_SPEED.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleModCastingSpeed(), and AuraEffect::HandleModCombatSpeedPct().

◆ ApplyDiminishingAura()

void Unit::ApplyDiminishingAura ( DiminishingGroup  group,
bool  apply 
)
15228{
15229 // Checking for existing in the table
15230 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15231 {
15232 if (i->DRGroup != group)
15233 continue;
15234
15235 if (apply)
15236 i->stack += 1;
15237 else if (i->stack)
15238 {
15239 i->stack -= 1;
15240 // Remember time after last aura from group removed
15241 if (i->stack == 0)
15242 i->hitTime = GameTime::GetGameTimeMS().count();
15243 }
15244 break;
15245 }
15246}
Milliseconds GetGameTimeMS()
Definition: GameTime.cpp:43
Diminishing m_Diminishing
Definition: Unit.h:2156

References GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by UnitAura::_ApplyForTarget(), and UnitAura::_UnapplyForTarget().

◆ ApplyDiminishingToDuration()

float Unit::ApplyDiminishingToDuration ( DiminishingGroup  group,
int32 duration,
Unit caster,
DiminishingLevels  Level,
int32  limitduration 
)
15149{
15150 // xinef: dont apply diminish to self casts
15151 if (duration == -1 || group == DIMINISHING_NONE)
15152 return 1.0f;
15153
15154 // test pet/charm masters instead pets/charmeds
15155 Unit const* targetOwner = GetOwner();
15156 Unit const* casterOwner = caster->GetOwner();
15157
15158 // Duration of crowd control abilities on pvp target is limited by 10 sec. (2.2.0)
15159 if (limitduration > 0 && duration > limitduration)
15160 {
15161 Unit const* target = targetOwner ? targetOwner : this;
15162 Unit const* source = casterOwner ? casterOwner : caster;
15163
15164 if ((target->IsPlayer()
15166 && source->IsPlayer())
15167 duration = limitduration;
15168 }
15169
15170 float mod = 1.0f;
15171
15172 if (group == DIMINISHING_TAUNT)
15173 {
15175 {
15176 DiminishingLevels diminish = Level;
15177 switch (diminish)
15178 {
15180 break;
15182 mod = 0.65f;
15183 break;
15185 mod = 0.4225f;
15186 break;
15188 mod = 0.274625f;
15189 break;
15191 mod = 0.0f;
15192 break;
15193 default:
15194 break;
15195 }
15196 }
15197 }
15198 // Some diminishings applies to mobs too (for example, Stun)
15200 && ((targetOwner ? (targetOwner->IsPlayer()) : (IsPlayer()))
15201 || (IsCreature() && ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_ALL_DIMINISH))))
15203 {
15204 DiminishingLevels diminish = Level;
15205 switch (diminish)
15206 {
15208 break;
15210 mod = 0.5f;
15211 break;
15213 mod = 0.25f;
15214 break;
15216 mod = 0.0f;
15217 break;
15218 default:
15219 break;
15220 }
15221 }
15222
15223 duration = int32(duration * mod);
15224 return mod;
15225}
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group)
Definition: SpellMgr.cpp:245
DiminishingLevels
Definition: Unit.h:263
@ DIMINISHING_LEVEL_3
Definition: Unit.h:266
@ DIMINISHING_LEVEL_1
Definition: Unit.h:264
@ DIMINISHING_LEVEL_4
Definition: Unit.h:268
@ DIMINISHING_LEVEL_IMMUNE
Definition: Unit.h:267
@ DIMINISHING_LEVEL_TAUNT_IMMUNE
Definition: Unit.h:269
@ DIMINISHING_LEVEL_2
Definition: Unit.h:265
@ CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS
Definition: CreatureData.h:64
@ CREATURE_FLAG_EXTRA_ALL_DIMINISH
Definition: CreatureData.h:65
@ Level
Requires the player to be at least a specific level.
@ DIMINISHING_NONE
Definition: SharedDefines.h:3508
@ DIMINISHING_TAUNT
Definition: SharedDefines.h:3526
@ DRTYPE_PLAYER
Definition: SharedDefines.h:3501
@ DRTYPE_ALL
Definition: SharedDefines.h:3502
bool HasFlagsExtra(uint32 flag) const
Definition: Creature.h:73

References CREATURE_FLAG_EXTRA_ALL_DIMINISH, CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS, DIMINISHING_LEVEL_1, DIMINISHING_LEVEL_2, DIMINISHING_LEVEL_3, DIMINISHING_LEVEL_4, DIMINISHING_LEVEL_IMMUNE, DIMINISHING_LEVEL_TAUNT_IMMUNE, DIMINISHING_NONE, DIMINISHING_TAUNT, DRTYPE_ALL, DRTYPE_PLAYER, GetDiminishingReturnsGroupType(), GetOwner(), Creature::HasFlagsExtra(), Object::IsCreature(), Object::IsPlayer(), Level, and Object::ToCreature().

Referenced by Spell::DoSpellHitOnUnit().

◆ ApplyEffectModifiers()

float Unit::ApplyEffectModifiers ( SpellInfo const *  spellProto,
uint8  effect_index,
float  value 
) const
14931{
14932 if (Player* modOwner = GetSpellModOwner())
14933 {
14934 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_ALL_EFFECTS, value);
14935 switch (effect_index)
14936 {
14937 case 0:
14938 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT1, value);
14939 break;
14940 case 1:
14941 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT2, value);
14942 break;
14943 case 2:
14944 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT3, value);
14945 break;
14946 }
14947 }
14948 return value;
14949}
@ SPELLMOD_EFFECT2
Definition: SpellDefines.h:88
@ SPELLMOD_ALL_EFFECTS
Definition: SpellDefines.h:84
@ SPELLMOD_EFFECT3
Definition: SpellDefines.h:99
@ SPELLMOD_EFFECT1
Definition: SpellDefines.h:79
Player * GetSpellModOwner() const
Definition: Unit.cpp:16660

References GetSpellModOwner(), SpellInfo::Id, SPELLMOD_ALL_EFFECTS, SPELLMOD_EFFECT1, SPELLMOD_EFFECT2, and SPELLMOD_EFFECT3.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellEffectInfo::CalcValue(), and Spell::EffectSchoolDMG().

◆ ApplyResilience()

void Unit::ApplyResilience ( Unit const *  victim,
float *  crit,
int32 damage,
bool  isCrit,
CombatRating  type 
)
static
19025{
19026 // player mounted on multi-passenger mount is also classified as vehicle
19027 if (victim->IsVehicle() && !victim->IsPlayer())
19028 return;
19029
19030 Unit const* target = nullptr;
19031 if (victim->IsPlayer())
19032 target = victim;
19033 else if (victim->IsCreature())
19034 {
19035 if (Unit* owner = victim->GetOwner())
19036 if (owner->IsPlayer())
19037 target = owner;
19038 }
19039
19040 if (!target)
19041 return;
19042
19043 switch (type)
19044 {
19046 // Crit chance reduction works against nonpets
19047 if (crit)
19048 *crit -= target->GetMeleeCritChanceReduction();
19049 if (damage)
19050 {
19051 if (isCrit)
19052 *damage -= target->GetMeleeCritDamageReduction(*damage);
19053 *damage -= target->GetMeleeDamageReduction(*damage);
19054 }
19055 break;
19057 // Crit chance reduction works against nonpets
19058 if (crit)
19059 *crit -= target->GetRangedCritChanceReduction();
19060 if (damage)
19061 {
19062 if (isCrit)
19063 *damage -= target->GetRangedCritDamageReduction(*damage);
19064 *damage -= target->GetRangedDamageReduction(*damage);
19065 }
19066 break;
19068 // Crit chance reduction works against nonpets
19069 if (crit)
19070 *crit -= target->GetSpellCritChanceReduction();
19071 if (damage)
19072 {
19073 if (isCrit)
19074 *damage -= target->GetSpellCritDamageReduction(*damage);
19075 *damage -= target->GetSpellDamageReduction(*damage);
19076 }
19077 break;
19078 default:
19079 break;
19080 }
19081}
@ CR_CRIT_TAKEN_RANGED
Definition: Unit.h:233
@ CR_CRIT_TAKEN_SPELL
Definition: Unit.h:234
@ CR_CRIT_TAKEN_MELEE
Definition: Unit.h:232
float GetSpellCritChanceReduction() const
Definition: Unit.h:1201
float GetRangedCritChanceReduction() const
Definition: Unit.h:1200
uint32 GetSpellCritDamageReduction(uint32 damage) const
Definition: Unit.h:1205
float GetMeleeCritChanceReduction() const
Definition: Unit.h:1199
uint32 GetRangedDamageReduction(uint32 damage) const
Definition: Unit.h:1193
uint32 GetRangedCritDamageReduction(uint32 damage) const
Definition: Unit.h:1204
uint32 GetMeleeCritDamageReduction(uint32 damage) const
Definition: Unit.h:1203
uint32 GetSpellDamageReduction(uint32 damage) const
Definition: Unit.h:1194
uint32 GetMeleeDamageReduction(uint32 damage) const
Definition: Unit.h:1192

References CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, GetMeleeCritChanceReduction(), GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetOwner(), GetRangedCritChanceReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritChanceReduction(), GetSpellCritDamageReduction(), GetSpellDamageReduction(), Object::IsCreature(), Object::IsPlayer(), and IsVehicle().

Referenced by CalculateSpellDamageTaken(), GetUnitCriticalChance(), spell_valkyr_touch_aura::HandleEffectPeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and SpellTakenCritChance().

◆ ApplyResistanceBuffModsMod()

void Unit::ApplyResistanceBuffModsMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline
1130{ ApplyModSignedFloatValue(positive ? static_cast<uint16>(UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE) + school : static_cast<uint16>(UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE) + + school, val, apply); }
@ UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE
Definition: UpdateFields.h:157
@ UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE
Definition: UpdateFields.h:158
void ApplyModSignedFloatValue(uint16 index, float val, bool apply)
Definition: Object.cpp:811

References Object::ApplyModSignedFloatValue(), UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, and UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE.

Referenced by AuraEffect::HandleAuraModResistance(), and AuraEffect::HandleAuraModResistanceExclusive().

◆ ApplyResistanceBuffModsPercentMod()

void Unit::ApplyResistanceBuffModsPercentMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline

◆ ApplySpellDispelImmunity()

void Unit::ApplySpellDispelImmunity ( SpellInfo const *  spellProto,
DispelType  type,
bool  apply 
)
13511{
13512 ApplySpellImmune(spellProto->Id, IMMUNITY_DISPEL, type, apply);
13513
13514 if (apply && spellProto->HasAttribute(SPELL_ATTR1_IMMUNITY_PURGES_EFFECT))
13515 {
13516 // Create dispel mask by dispel type
13517 uint32 dispelMask = SpellInfo::GetDispelMask(type);
13518 // Dispel all existing auras vs current dispel type
13520 for (AuraApplicationMap::iterator itr = auras.begin(); itr != auras.end();)
13521 {
13522 SpellInfo const* spell = itr->second->GetBase()->GetSpellInfo();
13523 if (spell->GetDispelMask() & dispelMask)
13524 {
13525 // Dispel aura
13526 RemoveAura(itr);
13527 }
13528 else
13529 ++itr;
13530 }
13531 }
13532}
@ SPELL_ATTR1_IMMUNITY_PURGES_EFFECT
Definition: SharedDefines.h:445
@ IMMUNITY_DISPEL
Definition: SharedDefines.h:1409
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition: Unit.cpp:13483
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition: Unit.h:629
AuraApplicationMap & GetAppliedAuras()
Definition: Unit.h:1308
uint32 GetDispelMask() const
Definition: SpellInfo.cpp:2052

References ApplySpellImmune(), GetAppliedAuras(), SpellInfo::GetDispelMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IMMUNITY_DISPEL, RemoveAura(), and SPELL_ATTR1_IMMUNITY_PURGES_EFFECT.

Referenced by AuraEffect::HandleAuraModDispelImmunity().

◆ ApplySpellImmune()

void Unit::ApplySpellImmune ( uint32  spellId,
uint32  op,
uint32  type,
bool  apply,
SpellImmuneBlockType  blockType = SPELL_BLOCK_TYPE_ALL 
)
13484{
13485 if (apply)
13486 {
13487 // xinef: immunities with spellId 0 are intended to be applied only once (script purposes mosty)
13488 if (spellId == 0 && std::find_if(m_spellImmune[op].begin(), m_spellImmune[op].end(), spellIdImmunityPredicate(type)) != m_spellImmune[op].end())
13489 return;
13490
13491 SpellImmune immune;
13492 immune.spellId = spellId;
13493 immune.type = type;
13494 immune.blockType = blockType;
13495 m_spellImmune[op].push_back(std::move(immune));
13496 }
13497 else
13498 {
13499 for (SpellImmuneList::iterator itr = m_spellImmune[op].begin(); itr != m_spellImmune[op].end(); ++itr)
13500 {
13501 if (itr->spellId == spellId && itr->type == type)
13502 {
13503 m_spellImmune[op].erase(itr);
13504 break;
13505 }
13506 }
13507 }
13508}
Definition: Unit.cpp:13474
Definition: SpellDefines.h:174
uint32 blockType
Definition: SpellDefines.h:179
uint32 spellId
Definition: SpellDefines.h:177
uint32 type
Definition: SpellDefines.h:178

References SpellImmune::blockType, m_spellImmune, SpellImmune::spellId, and SpellImmune::type.

Referenced by Vehicle::ApplyAllImmunities(), boss_kelidan_the_breaker::ApplyImmunities(), ApplyMechanicImmune(), ApplySpellDispelImmunity(), boss_anubarak_trial::boss_anubarak_trialAI::boss_anubarak_trialAI(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_icehowl::boss_icehowlAI::boss_icehowlAI(), boss_sindragosa::boss_sindragosaAI::boss_sindragosaAI(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_void_reaver::boss_void_reaver(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDmgImmunity(), AuraEffect::HandleAuraModEffectImmunity(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleAuraModStateImmunity(), Aura::HandleAuraSpecificMods(), spell_q13007_iron_colossus::HandleDummy(), spell_love_in_air_perfume_immune::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_dk_anti_magic_shell_self::HandleEffectApply(), spell_dk_army_of_the_dead_passive::HandleEffectApply(), spell_dk_pet_scaling::HandleEffectApply(), spell_dru_treant_scaling::HandleEffectApply(), spell_pet_hit_expertise_scalling::HandleEffectApply(), spell_pet_intellect_spirit_resilience_scaling::HandleEffectApply(), spell_pet_spellhit_expertise_spellpen_scaling::HandleEffectApply(), spell_mage_pet_scaling::HandleEffectApply(), spell_pri_shadowfiend_scaling::HandleEffectApply(), spell_sha_feral_spirit_scaling::HandleEffectApply(), spell_sha_fire_elemental_scaling::HandleEffectApply(), spell_warl_infernal_scaling::HandleEffectApply(), spell_love_in_air_perfume_immune::HandleEffectRemove(), spell_dk_anti_magic_shell_self::HandleEffectRemove(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_illidan_shadow_prison_aura::HandleOnEffectApply(), spell_illidan_shadow_prison_aura::HandleOnEffectRemove(), npc_hyjal_jaina::hyjalJainaAI::hyjalJainaAI(), boss_hydross_the_unstable::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Player::LoadFromDB(), Creature::LoadSpellTemplateImmunity(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_necrotic_shard::npc_necrotic_shard(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_target_dummy::npc_target_dummyAI::npc_target_dummyAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::npc_tournament_training_dummyAI(), npc_training_dummy::npc_training_dummyAI::npc_training_dummyAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::npc_ulduar_arachnopod_destroyerAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::npc_valkyr_shadowguardAI(), spell_yogg_saron_malady_of_the_mind_aura::OnApply(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_chesspiece::Reset(), boss_curator::Reset(), boss_shade_of_aran::Reset(), npc_sanguine_spirit::Reset(), boss_felblood_kaelthas::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::Reset(), npc_dark_iron_guzzler::Reset(), boss_mal_ganis::boss_mal_ganisAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_gluth::boss_gluthAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_auriaya::boss_auriayaAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_supremus::Reset(), boss_kaelthas::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), boss_supremus::SchedulePhase(), boss_hydross_the_unstable::SetForm(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), and Creature::UpdateEntry().

◆ ApplyStatBuffMod()

void Unit::ApplyStatBuffMod ( Stats  stat,
float  val,
bool  apply 
)
inline
1024{ ApplyModSignedFloatValue((val > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), val, apply); }
@ UNIT_FIELD_POSSTAT0
Definition: UpdateFields.h:146
@ UNIT_FIELD_NEGSTAT0
Definition: UpdateFields.h:151

References Object::ApplyModSignedFloatValue(), UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::_ApplyItemBonuses(), Player::ApplyEnchantment(), and AuraEffect::HandleAuraModStat().

◆ ApplyStatPercentBuffMod()

void Unit::ApplyStatPercentBuffMod ( Stats  stat,
float  val,
bool  apply 
)
15439{
15440 if (val == -100.0f) // prevent set var to zero
15441 val = -99.99f;
15442 float var = GetStat(stat) * val / 100.0f;
15443 ApplyModSignedFloatValue((var > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), var, apply);
15444}
float GetStat(Stats stat) const
Definition: Unit.h:999

References Object::ApplyModSignedFloatValue(), GetStat(), UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by AuraEffect::HandleModTotalPercentStat().

◆ ApplyTotalThreatModifier()

float Unit::ApplyTotalThreatModifier ( float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
14743{
14744 if (!HasThreatAura() || fThreat < 0)
14745 return fThreat;
14746
14747 SpellSchools school = GetFirstSchoolInMask(schoolMask);
14748
14749 return fThreat * m_threatModifier[school];
14750}
SpellSchools
Definition: SharedDefines.h:293
SpellSchools GetFirstSchoolInMask(SpellSchoolMask mask)
Definition: SharedDefines.h:329
bool HasThreatAura() const
Definition: Unit.h:1748

References GetFirstSchoolInMask(), HasThreatAura(), and m_threatModifier.

Referenced by ThreatCalcHelper::calcThreat().

◆ Attack()

bool Unit::Attack ( Unit victim,
bool  meleeAttack 
)
Todo:
: Implement aggro range, detection range and assistance range templates
10343{
10344 if (!victim || victim == this)
10345 return false;
10346
10347 // dead units can neither attack nor be attacked
10348 if (!IsAlive() || !victim->IsAlive())
10349 return false;
10350
10351 // pussywizard: check map, world, phase >_> multithreading crash fix
10352 if (!IsInMap(victim) || !InSamePhase(victim))
10353 return false;
10354
10355 // player cannot attack in mount state
10356 if (IsPlayer() && IsMounted())
10357 return false;
10358
10359 // creatures cannot attack while evading
10360 Creature* creature = ToCreature();
10361 if (creature && creature->IsInEvadeMode())
10362 {
10363 return false;
10364 }
10365
10366 // creatures should not try to attack the player during polymorph
10367 if (creature && creature->IsPolymorphed())
10368 {
10369 return false;
10370 }
10371
10372 //if (HasUnitFlag(UNIT_FLAG_PACIFIED)) // pussywizard: why having this flag prevents from entering combat? it should just prevent melee attack
10373 // return false;
10374
10375 // nobody can attack GM in GM-mode
10376 if (victim->IsPlayer())
10377 {
10378 if (victim->ToPlayer()->IsGameMaster())
10379 return false;
10380 }
10381 else
10382 {
10383 if (victim->ToCreature()->IsEvadingAttacks())
10384 return false;
10385 }
10386
10387 // Unit with SPELL_AURA_SPIRIT_OF_REDEMPTION can not attack
10389 return false;
10390
10391 // remove SPELL_AURA_MOD_UNATTACKABLE at attack (in case non-interruptible spells stun aura applied also that not let attack)
10392 if (HasUnattackableAura())
10394
10395 if (m_attacking)
10396 {
10397 if (m_attacking == victim)
10398 {
10399 // switch to melee attack from ranged/magic
10400 if (meleeAttack)
10401 {
10403 {
10405 SendMeleeAttackStart(victim);
10406 return true;
10407 }
10408 }
10410 {
10412 SendMeleeAttackStop(victim);
10413 return true;
10414 }
10415 return false;
10416 }
10417
10418 // switch target
10419 InterruptSpell(CURRENT_MELEE_SPELL, true, true, true);
10420 if (!meleeAttack)
10422 }
10423
10424 if (m_attacking)
10426
10427 m_attacking = victim;
10429
10430 // Set our target
10431 SetTarget(victim->GetGUID());
10432
10433 if (meleeAttack)
10435
10436 Unit* owner = GetCharmerOrOwner();
10437 Creature* ownerCreature = owner ? owner->ToCreature() : nullptr;
10438 Creature* controlledCreatureWithSameVictim = nullptr;
10439 if (creature && !m_Controlled.empty())
10440 {
10441 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10442 {
10443 if ((*itr)->ToCreature() && (*itr)->GetVictim() == victim)
10444 {
10445 controlledCreatureWithSameVictim = (*itr)->ToCreature();
10446 break;
10447 }
10448 }
10449 }
10450
10451 // Share leash timer with controlled unit
10452 if (controlledCreatureWithSameVictim)
10453 creature->SetLastLeashExtensionTimePtr(controlledCreatureWithSameVictim->GetLastLeashExtensionTimePtr());
10454 // Share leash timer with owner
10455 else if (creature && ownerCreature && ownerCreature->GetVictim() == victim)
10457 // Update leash timer when attacking creatures
10458 else if (victim->IsCreature())
10460
10461 // set position before any AI calls/assistance
10462 //if (IsCreature())
10463 // ToCreature()->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ());
10464 if (creature && !(IsControllableGuardian() && IsControlledByPlayer()))
10465 {
10466 // should not let player enter combat by right clicking target - doesn't helps
10467 SetInCombatWith(victim);
10468 if (victim->IsPlayer())
10469 victim->SetInCombatWith(this);
10470
10471 AddThreat(victim, 0.0f);
10472
10474
10477 creature->CallAssistance();
10478
10480
10482 }
10483
10484 // delay offhand weapon attack by 50% of the base attack time
10487
10488 if (meleeAttack)
10489 SendMeleeAttackStart(victim);
10490
10491 return true;
10492}
@ SPELL_AURA_MOD_UNATTACKABLE
Definition: SpellAuraDefines.h:156
@ UNIT_NPC_EMOTESTATE
Definition: UpdateFields.h:140
@ UNIT_STATE_MELEE_ATTACKING
Definition: UnitDefines.h:171
@ CURRENT_MELEE_SPELL
Definition: Unit.h:538
@ CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE
Definition: CreatureData.h:70
@ CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD
Definition: WorldConfig.h:236
@ EMOTE_ONESHOT_NONE
Definition: SharedDefines.h:1905
@ AI_REACTION_HOSTILE
Definition: SharedDefines.h:3492
T CalculatePct(T base, U pct)
Definition: Util.h:61
#define sWorld
Definition: World.h:316
void CallAssistance(Unit *target=nullptr)
Definition: Creature.cpp:2435
bool IsEvadingAttacks() const
Definition: Creature.h:136
std::shared_ptr< time_t > const & GetLastLeashExtensionTimePtr() const
Definition: Creature.cpp:3707
void UpdateLeashExtensionTime()
Definition: Creature.cpp:3729
void SetAssistanceTimer(uint32 value)
Definition: Creature.h:409
void SetLastLeashExtensionTimePtr(std::shared_ptr< time_t > const &timer)
Definition: Creature.cpp:3714
void SendAIReaction(AiReaction reactionType)
Definition: Creature.cpp:2423
bool IsInEvadeMode() const
Definition: Creature.h:135
float GetFloatValue(uint16 index) const
Definition: Object.cpp:306
bool InSamePhase(WorldObject const *obj) const
Definition: Object.h:514
bool IsInMap(WorldObject const *obj) const
Definition: Object.cpp:1290
bool IsGameMaster() const
Definition: Player.h:1161
bool HasOffhandWeaponForAttack() const
Definition: Unit.h:931
void ClearUnitState(uint32 f)
Definition: Unit.h:692
bool IsPolymorphed() const
Definition: Unit.cpp:16824
void AddThreat(Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition: Unit.cpp:14754
void _removeAttacker(Unit *pAttacker)
Definition: Unit.h:2148
void _addAttacker(Unit *pAttacker)
Definition: Unit.h:2147
void SetInCombatWith(Unit *enemy, uint32 duration=0)
Definition: Unit.cpp:13675
bool HasUnattackableAura() const
Definition: Unit.h:1750
Unit * GetCharmerOrOwner() const
Definition: Unit.h:1215
bool IsMounted() const
Definition: Unit.h:1803
Unit * GetVictim() const
Definition: Unit.h:850
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition: Unit.cpp:3095
bool IsControllableGuardian() const
Definition: Unit.h:748
void SetUInt32Value(uint16 index, uint32 value)
Definition: Unit.cpp:21182
void SendMeleeAttackStop(Unit *victim=nullptr)
Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or int...
Definition: Unit.cpp:3111
bool IsControlledByPlayer() const
Definition: Unit.h:1236
bool HasSpiritOfRedemptionAura() const
Definition: Unit.h:1721
virtual void SetTarget(ObjectGuid=ObjectGuid::Empty)=0

References _addAttacker(), _removeAttacker(), AddThreat(), AddUnitState(), AI_REACTION_HOSTILE, BASE_ATTACK, CalculatePct(), Creature::CallAssistance(), ClearUnitState(), CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD, CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE, CURRENT_MELEE_SPELL, EMOTE_ONESHOT_NONE, getAttackTimer(), GetCharmerOrOwner(), Object::GetFloatValue(), Object::GetGUID(), Creature::GetLastLeashExtensionTimePtr(), GetVictim(), Creature::HasFlagsExtra(), HasOffhandWeaponForAttack(), HasSpiritOfRedemptionAura(), HasUnattackableAura(), HasUnitState(), WorldObject::InSamePhase(), InterruptSpell(), IsAlive(), isAttackReady(), IsControllableGuardian(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), Player::IsGameMaster(), Creature::IsInEvadeMode(), WorldObject::IsInMap(), IsMounted(), Object::IsPlayer(), IsPolymorphed(), m_attacking, m_Controlled, OFF_ATTACK, RemoveAurasByType(), Creature::SendAIReaction(), SendMeleeAttackStart(), SendMeleeAttackStop(), Creature::SetAssistanceTimer(), setAttackTimer(), SetInCombatWith(), Creature::SetLastLeashExtensionTimePtr(), SetTarget(), SetUInt32Value(), SPELL_AURA_MOD_UNATTACKABLE, sWorld, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_BASEATTACKTIME, UNIT_NPC_EMOTESTATE, UNIT_STATE_MELEE_ATTACKING, and Creature::UpdateLeashExtensionTime().

Referenced by UnitAI::AttackStart(), FollowerAI::AttackStart(), PossessedAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::AttackStart(), npc_gunship_mage::npc_gunship_mageAI::AttackStart(), npc_gunship_gunner::npc_gunship_gunnerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), TurretAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alythess::AttackStart(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), boss_jormungarAI::AttackStart(), boss_four_horsemen::boss_four_horsemenAI::AttackStart(), boss_magus_telestra::AttackStart(), boss_kologarn::boss_kologarnAI::AttackStart(), boss_mimiron::boss_mimironAI::AttackStart(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_lady_malande::AttackStart(), boss_the_lurker_below::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), boss_nazan::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), npc_pet_gen_gnomish_flame_turret::AttackStart(), UnitAI::AttackStartCaster(), ScriptedAI::AttackStartNoMove(), PetAI::DoAttack(), WorldSession::HandleAttackSwingOpcode(), spell_q12096_q12092_dummy::HandleDummy(), WorldSession::HandlePetActionHelper(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_pet_dk_ghoul::IsSummonedBy(), boss_halazzi::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), RemoveCharmedBy(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), Player::UpdateCharmedAI(), and npc_ranger_lilatha::WaypointReached().

◆ AttackerStateUpdate()

void Unit::AttackerStateUpdate ( Unit victim,
WeaponAttackType  attType = BASE_ATTACK,
bool  extra = false,
bool  ignoreCasting = false 
)
2598{
2600 {
2601 return;
2602 }
2603
2604 if (HasUnitState(UNIT_STATE_CANNOT_AUTOATTACK) && !extra && !ignoreCasting)
2605 {
2606 return;
2607 }
2608
2609 if (!victim->IsAlive())
2610 return;
2611
2612 if ((attType == BASE_ATTACK || attType == OFF_ATTACK) && !IsWithinLOSInMap(victim))
2613 return;
2614
2615 // CombatStart puts the target into stand state, so we need to cache sit state here to know if we should crit later
2616 const bool sittingVictim = victim->IsPlayer() && (victim->IsSitState() || victim->getStandState() == UNIT_STAND_STATE_SLEEP);
2617
2618 CombatStart(victim);
2620
2621 if (attType != BASE_ATTACK && attType != OFF_ATTACK)
2622 return; // ignore ranged case
2623
2624 if (!extra && _lastExtraAttackSpell)
2625 {
2627 }
2628
2629 bool meleeAttack = true;
2630
2631 // melee attack spell casted at main hand attack only - no normal melee dmg dealt
2632 if (attType == BASE_ATTACK && m_currentSpells[CURRENT_MELEE_SPELL] && !extra)
2633 {
2634 meleeAttack = false; // The melee attack is replaced by the melee spell
2635
2637 SpellCastResult castResult = meleeSpell->CheckCast(false);
2638 if (castResult != SPELL_CAST_OK)
2639 {
2640 meleeSpell->SendCastResult(castResult);
2641 meleeSpell->SendInterrupted(0);
2642
2643 meleeSpell->finish(false);
2644 meleeSpell->SetExecutedCurrently(false);
2645
2646 if (castResult == SPELL_FAILED_NO_POWER)
2647 {
2648 // Not enough rage, do a regular melee attack instead
2649 meleeAttack = true;
2650 }
2651 }
2652 else
2653 {
2654 meleeSpell->cast(true);
2655 }
2656 }
2657 if (meleeAttack)
2658 {
2659 // attack can be redirected to another target
2660 victim = GetMeleeHitRedirectTarget(victim);
2661 CalcDamageInfo damageInfo;
2662 CalculateMeleeDamage(victim, &damageInfo, attType, sittingVictim);
2663
2664 // Send log damage message to client
2665 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2666 {
2667 Unit::DealDamageMods(victim, damageInfo.damages[i].damage, &damageInfo.damages[i].absorb);
2668 }
2669
2670 // Related to sparring system. Allow attack animations even if there are no damages
2671 if (victim->CanSparringWith(damageInfo.attacker))
2672 damageInfo.HitInfo |= HITINFO_FAKE_DAMAGE;
2673
2674 SendAttackStateUpdate(&damageInfo);
2675
2676 //TriggerAurasProcOnEvent(damageInfo);
2677
2678 _lastDamagedTargetGuid = victim->GetGUID();
2679
2680 DealMeleeDamage(&damageInfo, true);
2681
2682 DamageInfo dmgInfo(damageInfo);
2683 Unit::ProcDamageAndSpell(damageInfo.attacker, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, dmgInfo.GetDamage(),
2684 damageInfo.attackType, nullptr, nullptr, -1, nullptr, &dmgInfo);
2685
2686 if (IsPlayer())
2687 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (Player) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2688 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2689 else
2690 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (NPC) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2691 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2692
2693 // Let the pet know we've started attacking someting. Handles melee attacks only
2694 // Spells such as auto-shot and others handled in WorldSession::HandleCastSpellOpcode
2695 if (IsPlayer() && !m_Controlled.empty())
2696 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
2697 if (Unit* pet = *itr)
2698 if (pet->IsAlive() && pet->IsCreature())
2699 pet->ToCreature()->AI()->OwnerAttacked(victim);
2700 }
2701}
@ AURA_INTERRUPT_FLAG_MELEE_ATTACK
Definition: SpellDefines.h:55
#define MAX_ITEM_PROTO_DAMAGES
Definition: ItemTemplate.h:613
@ UNIT_STAND_STATE_SLEEP
Definition: UnitDefines.h:35
@ UNIT_STATE_CANNOT_AUTOATTACK
Definition: UnitDefines.h:216
@ UNIT_FLAG_PACIFIED
Definition: UnitDefines.h:269
@ HITINFO_FAKE_DAMAGE
Definition: Unit.h:122
@ SPELL_FAILED_NO_POWER
Definition: SharedDefines.h:1045
bool IsWithinLOSInMap(WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
Definition: Object.cpp:1352
std::string ToString() const
Definition: ObjectGuid.cpp:47
std::string ToString() const
Definition: Position.cpp:59
Definition: Unit.h:331
Definition: Unit.h:464
uint32 procAttacker
Definition: Unit.h:481
uint32 procVictim
Definition: Unit.h:482
uint32 absorb
Definition: Unit.h:472
struct CalcDamageInfo::@266 damages[MAX_ITEM_PROTO_DAMAGES]
uint32 damage
Definition: Unit.h:471
uint32 procEx
Definition: Unit.h:483
uint32 HitInfo
Definition: Unit.h:477
Unit * attacker
Definition: Unit.h:465
Unit * target
Definition: Unit.h:466
WeaponAttackType attackType
Definition: Unit.h:480
void SendAttackStateUpdate(CalcDamageInfo *damageInfo)
Definition: Unit.cpp:6575
void CombatStart(Unit *target, bool initialAggro=true)
Definition: Unit.cpp:13720
Unit * GetMeleeHitRedirectTarget(Unit *victim, SpellInfo const *spellInfo=nullptr)
Definition: Unit.cpp:11152
void CalculateMeleeDamage(Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
Definition: Unit.cpp:1496
static void ProcDamageAndSpell(Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition: Unit.cpp:6474
uint8 getStandState() const
Definition: Unit.h:1698
void DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
Definition: Unit.cpp:1861
bool CanSparringWith(Unit const *attacker) const
Definition: Unit.cpp:3992
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition: Unit.cpp:815
void cast(bool skipCheck=false)
Definition: Spell.cpp:3709
void SetExecutedCurrently(bool yes)
Definition: Spell.h:573
void SendInterrupted(uint8 result)
Definition: Spell.cpp:5112
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition: Spell.cpp:4607
void finish(bool ok=true)
Definition: Spell.cpp:4415

References _lastDamagedTargetGuid, _lastExtraAttackSpell, CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::attackType, AURA_INTERRUPT_FLAG_MELEE_ATTACK, BASE_ATTACK, CalculateMeleeDamage(), CanSparringWith(), Spell::cast(), Spell::CheckCast(), CombatStart(), CURRENT_MELEE_SPELL, CalcDamageInfo::damage, CalcDamageInfo::damages, DealDamageMods(), DealMeleeDamage(), Spell::finish(), DamageInfo::GetAbsorb(), DamageInfo::GetBlock(), DamageInfo::GetDamage(), Object::GetGUID(), GetMeleeHitRedirectTarget(), DamageInfo::GetResist(), getStandState(), HasUnitFlag(), HasUnitState(), CalcDamageInfo::HitInfo, HITINFO_FAKE_DAMAGE, IsAlive(), Object::IsPlayer(), IsSitState(), WorldObject::IsWithinLOSInMap(), LOG_DEBUG, m_Controlled, m_currentSpells, MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, CalcDamageInfo::procAttacker, ProcDamageAndSpell(), CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RemoveAurasWithInterruptFlags(), SendAttackStateUpdate(), Spell::SendCastResult(), Spell::SendInterrupted(), Spell::SetExecutedCurrently(), SPELL_CAST_OK, SPELL_FAILED_NO_POWER, CalcDamageInfo::target, ObjectGuid::ToString(), Position::ToString(), UNIT_FLAG_PACIFIED, UNIT_STAND_STATE_SLEEP, and UNIT_STATE_CANNOT_AUTOATTACK.

Referenced by UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), HandleProcExtraAttackFor(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Player::Update(), boss_dred::boss_dredAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), and boss_the_lurker_below::UpdateAI().

◆ AttackStop()

bool Unit::AttackStop ( )

Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.

10499{
10500 if (!m_attacking)
10501 return false;
10502
10503 Unit* victim = m_attacking;
10504
10506 m_attacking = nullptr;
10507
10508 // Clear our target
10510
10512
10514
10515 // reset only at real combat stop
10516 if (Creature* creature = ToCreature())
10517 {
10518 creature->SetNoCallAssistance(false);
10519
10520 if (creature->HasSearchedAssistance())
10521 {
10522 creature->SetNoSearchAssistance(false);
10523 }
10524 }
10525
10526 SendMeleeAttackStop(victim);
10527
10528 return true;
10529}

References _removeAttacker(), ClearUnitState(), CURRENT_MELEE_SPELL, ObjectGuid::Empty, InterruptSpell(), m_attacking, SendMeleeAttackStop(), SetTarget(), Object::ToCreature(), and UNIT_STATE_MELEE_ATTACKING.

Referenced by PetAI::_stopAttack(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CombatStop(), boss_jedoga_shadowseeker::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), advisor_baseAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_thekal::DamageTaken(), boss_viscidus::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), ScriptedAI::DoStopAttack(), Player::DuelComplete(), Spell::EffectSanctuary(), SmartAI::EnterEvadeMode(), Spell::finish(), WorldSession::HandleAttackStopOpcode(), spell_hun_scatter_shot::HandleDummy(), spell_mc_play_dead_aura::HandleEffectApply(), spell_q11065_wrangle_some_aether_rays_aura::HandleEffectApply(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetStopAttack(), RotateMovementGenerator::Initialize(), boss_janalai::JustEngagedWith(), PetAI::KilledUnit(), MotionMaster::MoveSeekAssistance(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), PetSpellFail(), RemoveCharmedBy(), boss_janalai::Reset(), boss_felmyst::ScheduleGroundAbilities(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_heigan::boss_heiganAI::StartFightPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), StopAttackFaction(), StopAttackingInvalidTarget(), boss_ouro::Submerge(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ BuildAuraStateUpdateForTarget()

uint32 Unit::BuildAuraStateUpdateForTarget ( Unit target) const
10632{
10634 for (AuraStateAurasMap::const_iterator itr = m_auraStateAuras.begin(); itr != m_auraStateAuras.end(); ++itr)
10635 if ((1 << (itr->first - 1)) & PER_CASTER_AURA_STATE_MASK)
10636 if (itr->second->GetBase()->GetCasterGUID() == target->GetGUID())
10637 auraStates |= (1 << (itr->first - 1));
10638
10639 return auraStates;
10640}
uint32 GetUInt32Value(uint16 index) const
Definition: Object.cpp:294

References Object::GetGUID(), Object::GetUInt32Value(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, and UNIT_FIELD_AURASTATE.

Referenced by PatchValuesUpdate().

◆ BuildCooldownPacket() [1/2]

void Unit::BuildCooldownPacket ( WorldPacket data,
uint8  flags,
PacketCooldowns const &  cooldowns 
)
20855{
20856 data.Initialize(SMSG_SPELL_COOLDOWN, 8 + 1 + (4 + 4) * cooldowns.size());
20857 data << GetGUID();
20858 data << uint8(flags);
20859 for (std::unordered_map<uint32, uint32>::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
20860 {
20861 data << uint32(itr->first);
20862 data << uint32(itr->second);
20863 }
20864}
@ SMSG_SPELL_COOLDOWN
Definition: Opcodes.h:338
void Initialize(uint16 opcode, std::size_t newres=200)
Definition: WorldPacket.h:68

References Object::GetGUID(), WorldPacket::Initialize(), and SMSG_SPELL_COOLDOWN.

◆ BuildCooldownPacket() [2/2]

◆ BuildHeartBeatMsg()

void Unit::BuildHeartBeatMsg ( WorldPacket data) const
2059{
2060 data->Initialize(MSG_MOVE_HEARTBEAT, 32);
2061 *data << GetPackGUID();
2062 BuildMovementPacket(data);
2063}
@ MSG_MOVE_HEARTBEAT
Definition: Opcodes.h:268
void BuildMovementPacket(ByteBuffer *data) const
Definition: Unit.cpp:19730

References BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), and MSG_MOVE_HEARTBEAT.

Referenced by boss_volkhan::boss_volkhanAI::MovementInform(), and SendMovementFlagUpdate().

◆ BuildMovementPacket()

void Unit::BuildMovementPacket ( ByteBuffer data) const
19731{
19732 *data << uint32(GetUnitMovementFlags()); // movement flags
19733 *data << uint16(GetExtraUnitMovementFlags()); // 2.3.0
19734 *data << uint32(GameTime::GetGameTimeMS().count()); // time / counter
19735 *data << GetPositionX();
19736 *data << GetPositionY();
19737 *data << GetPositionZ();
19738 *data << GetOrientation();
19739
19740 // 0x00000200
19742 {
19743 if (m_vehicle)
19744 *data << m_vehicle->GetBase()->GetPackGUID();
19745 else if (GetTransport())
19746 *data << GetTransport()->GetPackGUID();
19747 else
19748 *data << (uint8)0;
19749
19750 *data << float (GetTransOffsetX());
19751 *data << float (GetTransOffsetY());
19752 *data << float (GetTransOffsetZ());
19753 *data << float (GetTransOffsetO());
19754 *data << uint32(GetTransTime());
19755 *data << uint8 (GetTransSeat());
19756
19759 }
19760
19761 // 0x02200000
19764 *data << (float)m_movementInfo.pitch;
19765
19766 *data << (uint32)m_movementInfo.fallTime;
19767
19768 // 0x00001000
19770 {
19771 *data << (float)m_movementInfo.jump.zspeed;
19772 *data << (float)m_movementInfo.jump.sinAngle;
19773 *data << (float)m_movementInfo.jump.cosAngle;
19774 *data << (float)m_movementInfo.jump.xyspeed;
19775 }
19776
19777 // 0x04000000
19779 *data << (float)m_movementInfo.splineElevation;
19780}
@ MOVEMENTFLAG_ONTRANSPORT
Definition: UnitDefines.h:376
@ MOVEMENTFLAG_FLYING
Definition: UnitDefines.h:392
@ MOVEMENTFLAG_FALLING
Definition: UnitDefines.h:379
@ MOVEMENTFLAG_SWIMMING
Definition: UnitDefines.h:388
@ MOVEMENTFLAG_SPLINE_ELEVATION
Definition: UnitDefines.h:393
@ MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING
Definition: UnitDefines.h:428
@ MOVEMENTFLAG2_INTERPOLATED_MOVEMENT
Definition: UnitDefines.h:433
struct MovementInfo::JumpInfo jump
uint32 fallTime
Definition: Object.h:319
struct MovementInfo::TransportInfo transport
float splineElevation
Definition: Object.h:333
float pitch
Definition: Object.h:316
uint32 time2
Definition: Object.h:312
float cosAngle
Definition: Object.h:329
float xyspeed
Definition: Object.h:329
float zspeed
Definition: Object.h:329
float sinAngle
Definition: Object.h:329
float GetTransOffsetX() const
Definition: Object.h:684
float GetTransOffsetY() const
Definition: Object.h:685
float GetTransOffsetZ() const
Definition: Object.h:686
uint32 GetTransTime() const
Definition: Object.h:688
Transport * GetTransport() const
Definition: Object.h:683
float GetTransOffsetO() const
Definition: Object.h:687
uint32 GetUnitMovementFlags() const
Definition: Unit.h:730
uint16 GetExtraUnitMovementFlags() const
Definition: Unit.h:736

References MovementInfo::JumpInfo::cosAngle, MovementInfo::fallTime, MovementInfo::flags2, Vehicle::GetBase(), GetExtraUnitMovementFlags(), GameTime::GetGameTimeMS(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransOffsetO(), WorldObject::GetTransOffsetX(), WorldObject::GetTransOffsetY(), WorldObject::GetTransOffsetZ(), WorldObject::GetTransport(), WorldObject::GetTransSeat(), WorldObject::GetTransTime(), GetUnitMovementFlags(), MovementInfo::jump, WorldObject::m_movementInfo, m_vehicle, MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING, MOVEMENTFLAG2_INTERPOLATED_MOVEMENT, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FLYING, MOVEMENTFLAG_ONTRANSPORT, MOVEMENTFLAG_SPLINE_ELEVATION, MOVEMENTFLAG_SWIMMING, MovementInfo::pitch, MovementInfo::JumpInfo::sinAngle, MovementInfo::splineElevation, MovementInfo::TransportInfo::time2, MovementInfo::transport, MovementInfo::JumpInfo::xyspeed, and MovementInfo::JumpInfo::zspeed.

Referenced by BuildHeartBeatMsg(), Object::BuildMovementUpdate(), WorldSession::HandleMoveKnockBackAck(), Player::SendTeleportAckPacket(), SendTeleportPacket(), Player::SetCanFly(), Creature::SetCanFly(), Creature::SetDisableGravity(), Player::SetDisableGravity(), Player::SetFeatherFall(), Creature::SetFeatherFall(), Player::SetHover(), SetSpeed(), Player::SetWaterWalking(), and Creature::SetWaterWalking().

◆ BuildValuesUpdate()

void Unit::BuildValuesUpdate ( uint8  updateType,
ByteBuffer data,
Player target 
)
overrideprotectedvirtual

Reimplemented from Object.

20571{
20572 if (!target)
20573 return;
20574
20576 uint32 visibleFlag = UF_FLAG_PUBLIC;
20577
20578 if (target == this)
20579 visibleFlag |= UF_FLAG_PRIVATE;
20580
20582 if (GetOwnerGUID() == target->GetGUID())
20583 visibleFlag |= UF_FLAG_OWNER;
20584
20587 visibleFlag |= UF_FLAG_SPECIAL_INFO;
20588
20589 if (plr && plr->IsInSameRaidWith(target))
20590 visibleFlag |= UF_FLAG_PARTY_MEMBER;
20591
20592 uint64 cacheKey = static_cast<uint64>(visibleFlag) << 8 | updateType;
20593
20594 auto cacheIt = _valuesUpdateCache.find(cacheKey);
20595 if (cacheIt != _valuesUpdateCache.end())
20596 {
20597 int32 cachePos = static_cast<int32>(data->wpos());
20598 data->append(cacheIt->second.buffer);
20599
20600 BuildValuesCachePosPointers dataAdjustedPos = cacheIt->second.posPointers;
20601 if (cachePos)
20602 dataAdjustedPos.ApplyOffset(cachePos);
20603
20604 PatchValuesUpdate(*data, dataAdjustedPos, target);
20605
20606 return;
20607 }
20608
20609 BuildValuesCachedBuffer cacheValue(500);
20610
20611 ByteBuffer fieldBuffer(400);
20612
20613 UpdateMask updateMask;
20614 updateMask.SetCount(m_valuesCount);
20615
20616 for (uint16 index = 0; index < m_valuesCount; ++index)
20617 {
20618 if (_fieldNotifyFlags & flags[index] ||
20619 ((flags[index] & visibleFlag) & UF_FLAG_SPECIAL_INFO) ||
20620 ((updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(index) : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
20622 {
20623 updateMask.SetBit(index);
20624
20625 if (index == UNIT_NPC_FLAGS)
20626 {
20627 cacheValue.posPointers.UnitNPCFlagsPos = int32(fieldBuffer.wpos());
20628 fieldBuffer << m_uint32Values[UNIT_NPC_FLAGS];
20629 }
20630 else if (index == UNIT_FIELD_AURASTATE)
20631 {
20632 cacheValue.posPointers.UnitFieldAuraStatePos = int32(fieldBuffer.wpos());
20633 fieldBuffer << uint32(0); // Fill in later.
20634 }
20635 // FIXME: Some values at server stored in float format but must be sent to client in uint32 format
20636 else if (index >= UNIT_FIELD_BASEATTACKTIME && index <= UNIT_FIELD_RANGEDATTACKTIME)
20637 {
20638 // convert from float to uint32 and send
20639 fieldBuffer << uint32(m_floatValues[index] < 0 ? 0 : m_floatValues[index]);
20640 }
20641 // there are some float values which may be negative or can't get negative due to other checks
20642 else if ((index >= UNIT_FIELD_NEGSTAT0 && index <= UNIT_FIELD_NEGSTAT4) ||
20645 (index >= UNIT_FIELD_POSSTAT0 && index <= UNIT_FIELD_POSSTAT4))
20646 {
20647 fieldBuffer << uint32(m_floatValues[index]);
20648 }
20649 // Gamemasters should be always able to select units - remove not selectable flag
20650 else if (index == UNIT_FIELD_FLAGS)
20651 {
20652 cacheValue.posPointers.UnitFieldFlagsPos = int32(fieldBuffer.wpos());
20653 fieldBuffer << m_uint32Values[UNIT_FIELD_FLAGS];
20654 }
20655 // use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures
20656 else if (index == UNIT_FIELD_DISPLAYID)
20657 {
20658 cacheValue.posPointers.UnitFieldDisplayPos = int32(fieldBuffer.wpos());
20659 fieldBuffer << m_uint32Values[UNIT_FIELD_DISPLAYID];
20660 }
20661 else if (index == UNIT_DYNAMIC_FLAGS)
20662 {
20663 cacheValue.posPointers.UnitDynamicFlagsPos = int32(fieldBuffer.wpos());
20665 fieldBuffer << dynamicFlags;
20666 }
20667 else if (index == UNIT_FIELD_BYTES_2)
20668 {
20669 cacheValue.posPointers.UnitFieldBytes2Pos = int32(fieldBuffer.wpos());
20670 fieldBuffer << m_uint32Values[index];
20671 }
20672 else if (index == UNIT_FIELD_FACTIONTEMPLATE)
20673 {
20674 cacheValue.posPointers.UnitFieldFactionTemplatePos = int32(fieldBuffer.wpos());
20675 fieldBuffer << m_uint32Values[index];
20676 }
20677 else
20678 {
20679 if (sScriptMgr->ShouldTrackValuesUpdatePosByIndex(this, updateType, index))
20680 cacheValue.posPointers.other[index] = static_cast<uint32>(fieldBuffer.wpos());
20681
20682 // send in current format (float as float, uint32 as uint32)
20683 fieldBuffer << m_uint32Values[index];
20684 }
20685 }
20686 }
20687
20688 cacheValue.buffer << uint8(updateMask.GetBlockCount());
20689 updateMask.AppendToPacket(&cacheValue.buffer);
20690 int32 fieldBufferPos = static_cast<int32>(cacheValue.buffer.wpos());
20691 cacheValue.buffer.append(fieldBuffer);
20692 cacheValue.posPointers.ApplyOffset(fieldBufferPos);
20693
20694 int32 cachePos = static_cast<int32>(data->wpos());
20695 data->append(cacheValue.buffer);
20696
20697 BuildValuesCachePosPointers dataAdjustedPos = cacheValue.posPointers;
20698 if (cachePos)
20699 dataAdjustedPos.ApplyOffset(cachePos);
20700
20701 PatchValuesUpdate(*data, dataAdjustedPos, target);
20702
20703 _valuesUpdateCache.insert(std::pair<uint64, BuildValuesCachedBuffer>(cacheKey, std::move(cacheValue)));
20704}
@ SPELL_AURA_EMPATHY
Definition: SpellAuraDefines.h:184
@ UF_FLAG_SPECIAL_INFO
Definition: UpdateFieldFlags.h:32
@ UF_FLAG_PUBLIC
Definition: UpdateFieldFlags.h:27
@ UF_FLAG_OWNER
Definition: UpdateFieldFlags.h:29
@ UF_FLAG_PRIVATE
Definition: UpdateFieldFlags.h:28
@ UF_FLAG_PARTY_MEMBER
Definition: UpdateFieldFlags.h:33
uint32 UnitUpdateFieldFlags[PLAYER_END]
Definition: UpdateFieldFlags.cpp:162
@ UNIT_NPC_FLAGS
Definition: UpdateFields.h:139
@ UNIT_FIELD_RANGEDATTACKTIME
Definition: UpdateFields.h:121
@ UNIT_FIELD_DISPLAYID
Definition: UpdateFields.h:124
@ UNIT_FIELD_FACTIONTEMPLATE
Definition: UpdateFields.h:115
@ UNIT_FIELD_POSSTAT4
Definition: UpdateFields.h:150
@ UNIT_FIELD_NEGSTAT4
Definition: UpdateFields.h:155
@ UNIT_FIELD_FLAGS
Definition: UpdateFields.h:117
@ UNIT_DYNAMIC_FLAGS
Definition: UpdateFields.h:136
@ UPDATETYPE_VALUES
Definition: UpdateData.h:28
@ UNIT_DYNFLAG_SPECIALINFO
Definition: SharedDefines.h:3375
@ UNIT_DYNFLAG_TAPPED_BY_PLAYER
Definition: SharedDefines.h:3374
@ UNIT_DYNFLAG_TAPPED
Definition: SharedDefines.h:3373
std::uint64_t uint64
Definition: Define.h:106
uint16 _fieldNotifyFlags
Definition: Object.h:268
bool HasDynamicFlag(uint32 flag) const
Definition: Object.h:123
UpdateMask _changesMask
Definition: Object.h:264
uint32 * m_uint32Values
Definition: Object.h:260
uint16 m_valuesCount
Definition: Object.h:266
float * m_floatValues
Definition: Object.h:261
Definition: UpdateMask.h:25
uint32 GetBlockCount() const
Definition: UpdateMask.h:62
bool GetBit(uint32 index) const
Definition: UpdateMask.h:47
void SetCount(uint32 valuesCount)
Definition: UpdateMask.h:65
void SetBit(uint32 index)
Definition: UpdateMask.h:45
void AppendToPacket(ByteBuffer *data)
Definition: UpdateMask.h:49
bool IsInSameRaidWith(Player const *p) const
Definition: Player.h:1881
ValuesUpdateCache _valuesUpdateCache
Definition: Unit.h:2179
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition: Unit.cpp:10711
bool HasAuraTypeWithCaster(AuraType auratype, ObjectGuid caster) const
Definition: Unit.cpp:5798
ObjectGuid GetOwnerGUID() const
Definition: Unit.h:668
void PatchValuesUpdate(ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
Definition: Unit.cpp:20706
Definition: UnitUtils.h:65
void ApplyOffset(uint32 offset)
Definition: UnitUtils.h:70
Definition: UnitUtils.h:110
Definition: ByteBuffer.h:70
void append(T value)
Definition: ByteBuffer.h:129
std::size_t wpos() const
Definition: ByteBuffer.h:330

References Object::_changesMask, Object::_fieldNotifyFlags, _valuesUpdateCache, ByteBuffer::append(), UpdateMask::AppendToPacket(), BuildValuesCachePosPointers::ApplyOffset(), BuildValuesCachedBuffer::buffer, UpdateMask::GetBit(), UpdateMask::GetBlockCount(), GetCharmerOrOwnerPlayerOrPlayerItself(), Object::GetGUID(), GetOwnerGUID(), HasAuraTypeWithCaster(), Object::HasDynamicFlag(), Object::HasFlag(), Player::IsInSameRaidWith(), Object::m_floatValues, Object::m_uint32Values, Object::m_valuesCount, BuildValuesCachePosPointers::other, PatchValuesUpdate(), PER_CASTER_AURA_STATE_MASK, BuildValuesCachedBuffer::posPointers, UpdateMask::SetBit(), UpdateMask::SetCount(), SPELL_AURA_EMPATHY, sScriptMgr, UF_FLAG_OWNER, UF_FLAG_PARTY_MEMBER, UF_FLAG_PRIVATE, UF_FLAG_PUBLIC, UF_FLAG_SPECIAL_INFO, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_SPECIALINFO, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_FIELD_AURASTATE, UNIT_FIELD_BASEATTACKTIME, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FACTIONTEMPLATE, UNIT_FIELD_FLAGS, UNIT_FIELD_NEGSTAT0, UNIT_FIELD_NEGSTAT4, UNIT_FIELD_POSSTAT0, UNIT_FIELD_POSSTAT4, UNIT_FIELD_RANGEDATTACKTIME, UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, BuildValuesCachePosPointers::UnitNPCFlagsPos, UnitUpdateFieldFlags, UPDATETYPE_VALUES, and ByteBuffer::wpos().

◆ CalcAbsorbResist()

void Unit::CalcAbsorbResist ( DamageInfo dmgInfo,
bool  Splited = false 
)
static
2180{
2181 Unit* victim = dmgInfo.GetVictim();
2182 Unit* attacker = dmgInfo.GetAttacker();
2183 uint32 damage = dmgInfo.GetDamage();
2184 SpellSchoolMask schoolMask = dmgInfo.GetSchoolMask();
2185 SpellInfo const* spellInfo = dmgInfo.GetSpellInfo();
2186
2187 if (!victim || !victim->IsAlive() || !damage)
2188 return;
2189
2190 // Magic damage, check for resists
2191 // Ignore spells that cant be resisted
2192 // Xinef: holy resistance exists for npcs
2193 if (!(schoolMask & SPELL_SCHOOL_MASK_NORMAL) && (!(schoolMask & SPELL_SCHOOL_MASK_HOLY) || victim->IsCreature()) && (!spellInfo || (!spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))))
2194 {
2195 float averageResist = Unit::GetEffectiveResistChance(attacker, schoolMask, victim);
2196
2197 float discreteResistProbability[11];
2198 for (uint32 i = 0; i < 11; ++i)
2199 {
2200 discreteResistProbability[i] = 0.5f - 2.5f * std::fabs(0.1f * i - averageResist);
2201 if (discreteResistProbability[i] < 0.0f)
2202 discreteResistProbability[i] = 0.0f;
2203 }
2204
2205 if (averageResist <= 0.1f)
2206 {
2207 discreteResistProbability[0] = 1.0f - 7.5f * averageResist;
2208 discreteResistProbability[1] = 5.0f * averageResist;
2209 discreteResistProbability[2] = 2.5f * averageResist;
2210 }
2211
2212 float r = float(rand_norm());
2213 uint32 i = 0;
2214 float probabilitySum = discreteResistProbability[0];
2215
2216 while (r >= probabilitySum && i < 10)
2217 probabilitySum += discreteResistProbability[++i];
2218
2219 float damageResisted = float(damage * i / 10);
2220
2221 if (damageResisted) // if equal to 0, checking these is pointless
2222 {
2223 if (attacker)
2224 {
2226 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2227 if (((*j)->GetMiscValue() & schoolMask) && (*j)->IsAffectedOnSpell(spellInfo))
2228 AddPct(damageResisted, -(*j)->GetAmount());
2229
2231 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2232 if ((*j)->GetMiscValue() & schoolMask)
2233 AddPct(damageResisted, -(*j)->GetAmount());
2234 }
2235
2236 // pussywizard:
2237 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC))
2238 {
2239 uint32 damageAfterArmor = Unit::CalcArmorReducedDamage(attacker, victim, damage, spellInfo, 0, BASE_ATTACK);
2240 uint32 armorReduction = damage - damageAfterArmor;
2241 if (armorReduction < damageResisted) // pick the lower one, the weakest resistance counts
2242 damageResisted = armorReduction;
2243 }
2244 }
2245
2246 dmgInfo.ResistDamage(uint32(damageResisted));
2247 }
2248
2249 // Ignore Absorption Auras
2250 float auraAbsorbMod = 0;
2251 if (attacker)
2252 {
2254 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasA.begin(); itr != AbsIgnoreAurasA.end(); ++itr)
2255 {
2256 if (!((*itr)->GetMiscValue() & schoolMask))
2257 continue;
2258
2259 if ((*itr)->GetAmount() > auraAbsorbMod)
2260 auraAbsorbMod = float((*itr)->GetAmount());
2261 }
2262
2264 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasB.begin(); itr != AbsIgnoreAurasB.end(); ++itr)
2265 {
2266 if (!((*itr)->GetMiscValue() & schoolMask))
2267 continue;
2268
2269 if (((*itr)->GetAmount() > auraAbsorbMod) && (*itr)->IsAffectedOnSpell(spellInfo))
2270 auraAbsorbMod = float((*itr)->GetAmount());
2271 }
2272 RoundToInterval(auraAbsorbMod, 0.0f, 100.0f);
2273 }
2274
2275 // We're going to call functions which can modify content of the list during iteration over it's elements
2276 // Let's copy the list so we can prevent iterator invalidation
2278 std::sort(vSchoolAbsorbCopy.begin(), vSchoolAbsorbCopy.end(), Acore::AbsorbAuraOrderPred());
2279
2280 // absorb without mana cost
2281 for (AuraEffectList::iterator itr = vSchoolAbsorbCopy.begin(); (itr != vSchoolAbsorbCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2282 {
2283 AuraEffect* absorbAurEff = *itr;
2284 // Check if aura was removed during iteration - we don't need to work on such auras
2285 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2286 if (!aurApp)
2287 continue;
2288 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2289 continue;
2290
2291 // get amount which can be still absorbed by the aura
2292 int32 currentAbsorb = absorbAurEff->GetAmount();
2293 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2294 if (currentAbsorb < 0)
2295 currentAbsorb = 0;
2296
2297 uint32 tempAbsorb = uint32(currentAbsorb);
2298
2299 bool defaultPrevented = false;
2300
2301 absorbAurEff->GetBase()->CallScriptEffectAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2302 currentAbsorb = tempAbsorb;
2303
2304 if (defaultPrevented)
2305 continue;
2306
2307 // absorb must be smaller than the damage itself
2308 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2309
2310 // xinef: do this after absorb is rounded to damage...
2311 AddPct(currentAbsorb, -auraAbsorbMod);
2312
2313 dmgInfo.AbsorbDamage(currentAbsorb);
2314
2315 tempAbsorb = currentAbsorb;
2316 absorbAurEff->GetBase()->CallScriptEffectAfterAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2317
2318 // Check if our aura is using amount to count damage
2319 if (absorbAurEff->GetAmount() >= 0)
2320 {
2321 // Reduce shield amount
2322 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2323 // Aura cannot absorb anything more - remove it
2324 if (absorbAurEff->GetAmount() <= 0)
2325 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2326 }
2327 }
2328
2329 // absorb by mana cost
2331 for (AuraEffectList::const_iterator itr = vManaShieldCopy.begin(); (itr != vManaShieldCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2332 {
2333 AuraEffect* absorbAurEff = *itr;
2334 // Check if aura was removed during iteration - we don't need to work on such auras
2335 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2336 if (!aurApp)
2337 continue;
2338 // check damage school mask
2339 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2340 continue;
2341
2342 // get amount which can be still absorbed by the aura
2343 int32 currentAbsorb = absorbAurEff->GetAmount();
2344 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2345 if (currentAbsorb < 0)
2346 currentAbsorb = 0;
2347
2348 uint32 tempAbsorb = currentAbsorb;
2349
2350 bool defaultPrevented = false;
2351
2352 absorbAurEff->GetBase()->CallScriptEffectManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2353 currentAbsorb = tempAbsorb;
2354
2355 if (defaultPrevented)
2356 continue;
2357
2358 // absorb must be smaller than the damage itself
2359 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2360
2361 // xinef: do this after absorb is rounded to damage...
2362 AddPct(currentAbsorb, -auraAbsorbMod);
2363
2364 int32 manaReduction = currentAbsorb;
2365
2366 // lower absorb amount by talents
2367 if (float manaMultiplier = absorbAurEff->GetSpellInfo()->Effects[absorbAurEff->GetEffIndex()].CalcValueMultiplier(absorbAurEff->GetCaster()))
2368 manaReduction = int32(float(manaReduction) * manaMultiplier);
2369
2370 int32 manaTaken = -victim->ModifyPower(POWER_MANA, -manaReduction);
2371
2372 // take case when mana has ended up into account
2373 currentAbsorb = currentAbsorb ? int32(float(currentAbsorb) * (float(manaTaken) / float(manaReduction))) : 0;
2374
2375 dmgInfo.AbsorbDamage(currentAbsorb);
2376
2377 tempAbsorb = currentAbsorb;
2378 absorbAurEff->GetBase()->CallScriptEffectAfterManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2379
2380 // Check if our aura is using amount to count damage
2381 if (absorbAurEff->GetAmount() >= 0)
2382 {
2383 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2384 if ((absorbAurEff->GetAmount() <= 0))
2385 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2386 }
2387 }
2388
2389 // split damage auras - only when not damaging self
2390 // Xinef: not true - Warlock Hellfire
2391 if (/*victim != attacker &&*/ !Splited)
2392 {
2393 // We're going to call functions which can modify content of the list during iteration over it's elements
2394 // Let's copy the list so we can prevent iterator invalidation
2395 AuraEffectList vSplitDamageFlatCopy(victim->GetAuraEffectsByType(SPELL_AURA_SPLIT_DAMAGE_FLAT)); // Not used by any spell
2396 for (AuraEffectList::iterator itr = vSplitDamageFlatCopy.begin(); (itr != vSplitDamageFlatCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2397 {
2398 // Check if aura was removed during iteration - we don't need to work on such auras
2399 if (!((*itr)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
2400 continue;
2401 // check damage school mask
2402 if (!((*itr)->GetMiscValue() & schoolMask))
2403 continue;
2404
2405 // Damage can be splitted only if aura has an alive caster
2406 Unit* caster = (*itr)->GetCaster();
2407 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2408 continue;
2409
2410 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2411 // Ignore LOS attribute is only used for the cast portion of the spell
2412 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2413 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2414 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2415 continue;
2416
2417 int32 splitDamage = (*itr)->GetAmount();
2418
2419 // absorb must be smaller than the damage itself
2420 splitDamage = RoundToInterval(splitDamage, 0, int32(dmgInfo.GetDamage()));
2421
2422 dmgInfo.AbsorbDamage(splitDamage);
2423
2424 uint32 splitted = splitDamage;
2425 uint32 splitted_absorb = 0;
2426 uint32 splitted_resist = 0;
2427
2428 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2429 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, schoolMask, dmgInfo.GetDamageType());
2430 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2431 {
2432 procEx |= PROC_EX_IMMUNE;
2433 splittedDmgInfo.AbsorbDamage(splitted);
2434 }
2435 else
2436 {
2437 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2438 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2439 }
2440
2441 splitted_absorb = splittedDmgInfo.GetAbsorb();
2442 splitted_resist = splittedDmgInfo.GetResist();
2443 splitted = splittedDmgInfo.GetDamage();
2444
2445 // create procs
2446 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2447 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted, nullptr, -1, nullptr, &splittedDmgInfo);
2448
2449 if (attacker)
2450 {
2451 attacker->SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo(), splitted, schoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2452 }
2453
2454 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2455 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false);
2456 }
2457
2458 // We're going to call functions which can modify content of the list during iteration over it's elements
2459 // Let's copy the list so we can prevent iterator invalidation
2461 for (AuraEffectList::iterator itr = vSplitDamagePctCopy.begin(); (itr != vSplitDamagePctCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2462 {
2463 // Check if aura was removed during iteration - we don't need to work on such auras
2464 AuraApplication const* aurApp = (*itr)->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2465 if (!aurApp)
2466 continue;
2467
2468 // check damage school mask
2469 if (!((*itr)->GetMiscValue() & schoolMask))
2470 continue;
2471
2472 // Damage can be splitted only if aura has an alive caster
2473 Unit* caster = (*itr)->GetCaster();
2474 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2475 continue;
2476
2477 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2478 // Ignore LOS attribute is only used for the cast portion of the spell
2479 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2480 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2481 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2482 continue;
2483
2484 uint32 splitDamage = CalculatePct(dmgInfo.GetDamage(), (*itr)->GetAmount());
2485 SpellSchoolMask splitSchoolMask = schoolMask;
2486
2487 (*itr)->GetBase()->CallScriptEffectSplitHandlers(*itr, aurApp, dmgInfo, splitDamage);
2488
2489 // absorb must be smaller than the damage itself
2490 splitDamage = RoundToInterval(splitDamage, uint32(0), uint32(dmgInfo.GetDamage()));
2491
2492 // Roar of Sacrifice, dont absorb it
2493 if (splitSpellInfo->Id != 53480)
2494 dmgInfo.AbsorbDamage(splitDamage);
2495 else
2496 splitSchoolMask = SPELL_SCHOOL_MASK_NATURE;
2497
2498 uint32 splitted = splitDamage;
2499 uint32 splitted_absorb = 0;
2500 uint32 splitted_resist = 0;
2501
2502 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2503 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, splitSchoolMask, dmgInfo.GetDamageType());
2504 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2505 {
2506 procEx |= PROC_EX_IMMUNE;
2507 splittedDmgInfo.AbsorbDamage(splitted);
2508 }
2509 else
2510 {
2511 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2512 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2513 }
2514
2515 splitted_absorb = splittedDmgInfo.GetAbsorb();
2516 splitted_resist = splittedDmgInfo.GetResist();
2517 splitted = splittedDmgInfo.GetDamage();
2518
2519 // create procs
2520 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2521 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted);
2522
2523 if (attacker)
2524 {
2525 attacker->SendSpellNonMeleeDamageLog(caster, splitSpellInfo, splitted, splitSchoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2526 }
2527
2528 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2529 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, splitSchoolMask, splitSpellInfo, false);
2530 }
2531 }
2532}
@ SPELL_ATTR0_CU_BINARY_SPELL
Definition: SpellInfo.h:196
@ SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC
Definition: SpellInfo.h:199
@ PROC_EX_NORMAL_HIT
Definition: SpellMgr.h:194
@ PROC_EX_IMMUNE
Definition: SpellMgr.h:202
@ SPELL_AURA_MANA_SHIELD
Definition: SpellAuraDefines.h:160
@ SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL
Definition: SpellAuraDefines.h:257
@ SPELL_AURA_MOD_IGNORE_TARGET_RESIST
Definition: SpellAuraDefines.h:332
@ SPELL_AURA_SPLIT_DAMAGE_FLAT
Definition: SpellAuraDefines.h:216
@ SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL
Definition: SpellAuraDefines.h:258
@ SPELL_AURA_SPLIT_DAMAGE_PCT
Definition: SpellAuraDefines.h:144
@ SPELL_AURA_SCHOOL_ABSORB
Definition: SpellAuraDefines.h:132
@ SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST
Definition: SpellAuraDefines.h:333
@ AURA_REMOVE_BY_ENEMY_SPELL
Definition: SpellAuraDefines.h:394
void createProcFlags(SpellInfo const *spellInfo, WeaponAttackType attackType, bool positive, uint32 &procAttacker, uint32 &procVictim)
Definition: Unit.cpp:16007
@ DIRECT_DAMAGE
Definition: Unit.h:249
@ MELEE_HIT_NORMAL
Definition: Unit.h:287
@ POWER_MANA
Definition: SharedDefines.h:280
@ SPELL_ATTR4_NO_CAST_LOG
Definition: SharedDefines.h:541
SpellSchoolMask
Definition: SharedDefines.h:306
@ SPELL_SCHOOL_MASK_NORMAL
Definition: SharedDefines.h:308
@ SPELL_SCHOOL_MASK_NATURE
Definition: SharedDefines.h:311
@ SPELL_SCHOOL_MASK_HOLY
Definition: SharedDefines.h:309
T AddPct(T &base, U pct)
Definition: Util.h:67
T RoundToInterval(T &num, T floor, T ceil)
Definition: Util.h:79
double rand_norm()
Definition: Random.cpp:85
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition: Object.cpp:1321
Definition: Unit.h:316
void ResistDamage(uint32 amount)
Definition: Unit.cpp:160
void AbsorbDamage(uint32 amount)
Definition: Unit.cpp:153
Unit * GetVictim() const
Definition: Unit.h:360
Unit * GetAttacker() const
Definition: Unit.h:359
SpellInfo const * GetSpellInfo() const
Definition: Unit.h:361
DamageEffectType GetDamageType() const
Definition: Unit.h:363
SpellSchoolMask GetSchoolMask() const
Definition: Unit.h:362
uint32 GetDamage() const
Definition: Unit.h:365
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition: Unit.cpp:14250
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition: Unit.h:1353
std::vector< AuraEffect * > AuraEffectList
Definition: Unit.h:636
static uint32 CalcArmorReducedDamage(Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
Definition: Unit.cpp:2063
static float GetEffectiveResistChance(Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
Definition: Unit.cpp:2145
void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log)
Definition: Unit.cpp:6406
void ProcDamageAndSpellFor(bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition: Unit.cpp:16141
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12995
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition: Unit.cpp:2179
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
Definition: Unit.cpp:825
Definition: SpellAuraEffects.h:39
SpellInfo const * GetSpellInfo() const
Definition: SpellAuraEffects.h:54
void SetAmount(int32 amount)
Definition: SpellAuraEffects.h:66
Unit * GetCaster() const
Definition: SpellAuraEffects.h:47
int32 GetMiscValue() const
Definition: SpellAuraEffects.cpp:443
Aura * GetBase() const
Definition: SpellAuraEffects.h:49
uint32 GetEffIndex() const
Definition: SpellAuraEffects.h:56
int32 GetAmount() const
Definition: SpellAuraEffects.h:64
Definition: SpellAuraEffects.h:350
void CallScriptEffectAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition: SpellAuras.cpp:2559
void CallScriptEffectAfterAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition: SpellAuras.cpp:2577
void CallScriptEffectManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition: SpellAuras.cpp:2591
void CallScriptEffectAfterManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition: SpellAuras.cpp:2605
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition: SpellInfo.h:393
float GetMaxRange(bool positive=false, Unit *caster=nullptr, Spell *spell=nullptr) const
Definition: SpellInfo.cpp:2335
bool IsPositive() const
Definition: SpellInfo.cpp:1237

References DamageInfo::AbsorbDamage(), AddPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, CalcAbsorbResist(), CalcArmorReducedDamage(), CalculatePct(), Aura::CallScriptEffectAbsorbHandlers(), Aura::CallScriptEffectAfterAbsorbHandlers(), Aura::CallScriptEffectAfterManaShieldHandlers(), Aura::CallScriptEffectManaShieldHandlers(), createProcFlags(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, SpellInfo::Effects, DamageInfo::GetAbsorb(), AuraEffect::GetAmount(), Aura::GetApplicationOfTarget(), DamageInfo::GetAttacker(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraApplication::GetBase(), AuraEffect::GetCaster(), DamageInfo::GetDamage(), DamageInfo::GetDamageType(), GetEffectiveResistChance(), AuraEffect::GetEffIndex(), Object::GetGUID(), SpellInfo::GetMaxRange(), AuraEffect::GetMiscValue(), DamageInfo::GetResist(), DamageInfo::GetSchoolMask(), DamageInfo::GetSpellInfo(), AuraEffect::GetSpellInfo(), DamageInfo::GetVictim(), SpellInfo::HasAttribute(), SpellInfo::Id, IsAlive(), Object::IsCreature(), IsImmunedToDamageOrSchool(), Object::IsInWorld(), SpellInfo::IsPositive(), WorldObject::IsWithinDist(), MELEE_HIT_NORMAL, ModifyPower(), POWER_MANA, PROC_EX_IMMUNE, PROC_EX_NORMAL_HIT, ProcDamageAndSpellFor(), rand_norm(), Aura::Remove(), DamageInfo::ResistDamage(), RoundToInterval(), SendSpellNonMeleeDamageLog(), AuraEffect::SetAmount(), SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC, SPELL_ATTR4_NO_CAST_LOG, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL, SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL, SPELL_AURA_SCHOOL_ABSORB, SPELL_AURA_SPLIT_DAMAGE_FLAT, SPELL_AURA_SPLIT_DAMAGE_PCT, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NATURE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalcAbsorbResist(), CalculateSpellDamageTaken(), DealDamage(), DealMeleeDamage(), Player::EnvironmentalDamage(), spell_valkyr_touch_aura::HandleEffectPeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcArmorReducedDamage()

uint32 Unit::CalcArmorReducedDamage ( Unit const *  attacker,
Unit const *  victim,
const uint32  damage,
SpellInfo const *  spellInfo,
uint8  attackerLevel = 0,
WeaponAttackType  attackType = MAX_ATTACK 
)
static
2064{
2065 float armor = float(victim->GetArmor());
2066
2067 // Ignore enemy armor by SPELL_AURA_MOD_TARGET_RESISTANCE aura
2068 if (attacker)
2069 {
2070 armor += attacker->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL);
2071
2072 if (spellInfo)
2073 if (Player* modOwner = attacker->GetSpellModOwner())
2074 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_IGNORE_ARMOR, armor);
2075
2076 AuraEffectList const& ResIgnoreAurasAb = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST);
2077 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2078 {
2079 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL
2080 && (*j)->IsAffectedOnSpell(spellInfo))
2081 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2082 }
2083
2084 AuraEffectList const& ResIgnoreAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST);
2085 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2086 {
2087 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
2088 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2089 }
2090
2091 // Apply Player CR_ARMOR_PENETRATION rating and buffs from stances\specializations etc.
2092 if (attacker->IsPlayer())
2093 {
2094 float bonusPct = 0;
2095 AuraEffectList const& armorPenAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ARMOR_PENETRATION_PCT);
2096 for (AuraEffectList::const_iterator itr = armorPenAuras.begin(); itr != armorPenAuras.end(); ++itr)
2097 {
2098 if ((*itr)->GetSpellInfo()->EquippedItemClass == -1)
2099 {
2100 if (!spellInfo || (*itr)->IsAffectedOnSpell(spellInfo) || (*itr)->GetMiscValue() & spellInfo->GetSchoolMask())
2101 bonusPct += (*itr)->GetAmount();
2102 else if (!(*itr)->GetMiscValue() && !(*itr)->HasSpellClassMask())
2103 bonusPct += (*itr)->GetAmount();
2104 }
2105 else
2106 {
2107 if (attacker->ToPlayer()->HasItemFitToSpellRequirements((*itr)->GetSpellInfo()))
2108 bonusPct += (*itr)->GetAmount();
2109 }
2110 }
2111
2112 float maxArmorPen = 0;
2113 if (victim->GetLevel() < 60)
2114 maxArmorPen = float(400 + 85 * victim->GetLevel());
2115 else
2116 maxArmorPen = 400 + 85 * victim->GetLevel() + 4.5f * 85 * (victim->GetLevel() - 59);
2117
2118 // Cap armor penetration to this number
2119 maxArmorPen = std::min((armor + maxArmorPen) / 3, armor);
2120 // Figure out how much armor do we ignore
2121 float armorPen = CalculatePct(maxArmorPen, bonusPct + attacker->ToPlayer()->GetRatingBonusValue(CR_ARMOR_PENETRATION));
2122 // Got the value, apply it
2123 armor -= std::min(armorPen, maxArmorPen);
2124 }
2125 }
2126
2127 if (armor < 0.0f)
2128 armor = 0.0f;
2129
2130 float levelModifier = attacker ? attacker->GetLevel() : attackerLevel;
2131 if (levelModifier > 59)
2132 levelModifier = levelModifier + (4.5f * (levelModifier - 59));
2133
2134 float tmpvalue = 0.1f * armor / (8.5f * levelModifier + 40);
2135 tmpvalue = tmpvalue / (1.0f + tmpvalue);
2136
2137 if (tmpvalue < 0.0f)
2138 tmpvalue = 0.0f;
2139 if (tmpvalue > 0.75f)
2140 tmpvalue = 0.75f;
2141
2142 return uint32(std::ceil(std::max(damage * (1.0f - tmpvalue), 0.0f)));
2143}
@ SPELL_AURA_MOD_ARMOR_PENETRATION_PCT
Definition: SpellAuraDefines.h:343
@ SPELL_AURA_MOD_TARGET_RESISTANCE
Definition: SpellAuraDefines.h:186
@ SPELLMOD_IGNORE_ARMOR
Definition: SpellDefines.h:89
@ CR_ARMOR_PENETRATION
Definition: Unit.h:242

References AddPct(), CalculatePct(), CR_ARMOR_PENETRATION, GetArmor(), GetAuraEffectsByType(), GetLevel(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), Player::HasItemFitToSpellRequirements(), SpellInfo::Id, Object::IsPlayer(), SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_ARMOR_PENETRATION_PCT, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL, SPELLMOD_IGNORE_ARMOR, and Object::ToPlayer().

Referenced by CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), boss_priestess_lackey_commonAI::GetThreatMod(), boss_faction_championsAI::GetThreatMod(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcHealAbsorb()

void Unit::CalcHealAbsorb ( HealInfo healInfo)
static
2535{
2536 if (!healInfo.GetHeal())
2537 return;
2538
2539 int32 const healing = static_cast<int32>(healInfo.GetHeal());
2540 int32 absorbAmount = 0;
2541
2542 // Need remove expired auras after
2543 bool existExpired = false;
2544
2545 // absorb without mana cost
2547 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end() && absorbAmount <= healing; ++i)
2548 {
2549 if (!((*i)->GetMiscValue() & healInfo.GetSpellInfo()->SchoolMask))
2550 continue;
2551
2552 // Max Amount can be absorbed by this aura
2553 int32 currentAbsorb = (*i)->GetAmount();
2554
2555 // Found empty aura (impossible but..)
2556 if (currentAbsorb <= 0)
2557 {
2558 existExpired = true;
2559 continue;
2560 }
2561
2562 // currentAbsorb - damage can be absorbed by shield
2563 // If need absorb less damage
2564 if (healing < currentAbsorb + absorbAmount)
2565 currentAbsorb = healing - absorbAmount;
2566
2567 absorbAmount += currentAbsorb;
2568
2569 // Reduce shield amount
2570 (*i)->SetAmount((*i)->GetAmount() - currentAbsorb);
2571 // Need remove it later
2572 if ((*i)->GetAmount() <= 0)
2573 existExpired = true;
2574 }
2575
2576 // Remove all expired absorb auras
2577 if (existExpired)
2578 {
2579 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end();)
2580 {
2581 AuraEffect* auraEff = *i;
2582 ++i;
2583 if (auraEff->GetAmount() <= 0)
2584 {
2585 uint32 removedAuras = healInfo.GetTarget()->m_removedAurasCount;
2587 if (healInfo.GetTarget()->m_removedAurasCount > removedAuras)
2588 i = vHealAbsorb.begin();
2589 }
2590 }
2591 }
2592
2593 if (absorbAmount > 0)
2594 healInfo.AbsorbHeal(absorbAmount);
2595}
@ SPELL_AURA_SCHOOL_HEAL_ABSORB
Definition: SpellAuraDefines.h:364
SpellInfo const * GetSpellInfo() const
Definition: Unit.h:416
void AbsorbHeal(uint32 amount)
Definition: Unit.h:391
Unit * GetTarget() const
Definition: Unit.h:412
uint32 GetHeal() const
Definition: Unit.h:413
uint32 SchoolMask
Definition: SpellInfo.h:392

References HealInfo::AbsorbHeal(), AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::GetAmount(), GetAuraEffectsByType(), AuraEffect::GetBase(), HealInfo::GetHeal(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), m_removedAurasCount, Aura::Remove(), SpellInfo::SchoolMask, and SPELL_AURA_SCHOOL_HEAL_ABSORB.

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), and HealBySpell().

◆ CalcSpellDuration()

int32 Unit::CalcSpellDuration ( SpellInfo const *  spellProto)
14958{
14959 uint8 comboPoints = GetComboPoints();
14960
14961 int32 minduration = spellProto->GetDuration();
14962 int32 maxduration = spellProto->GetMaxDuration();
14963
14964 int32 duration;
14965
14966 if (comboPoints && minduration != -1 && minduration != maxduration)
14967 duration = minduration + int32((maxduration - minduration) * comboPoints / 5);
14968 else
14969 duration = minduration;
14970
14971 return duration;
14972}
uint8 GetComboPoints(Unit const *who=nullptr) const
Definition: Unit.h:955

References GetComboPoints(), SpellInfo::GetDuration(), and SpellInfo::GetMaxDuration().

Referenced by Aura::CalcMaxDuration(), Spell::EffectInterruptCast(), Spell::EffectSchoolDMG(), and Aura::HandleAuraSpecificMods().

◆ CalculateAOEDamageReduction()

int32 Unit::CalculateAOEDamageReduction ( int32  damage,
uint32  schoolMask,
bool  npcCaster 
) const
20243{
20244 damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, schoolMask));
20245 if (npcCaster)
20247
20248 return damage;
20249}
@ SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE
Definition: SpellAuraDefines.h:373
@ SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE
Definition: SpellAuraDefines.h:292
float GetTotalAuraMultiplierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:6070

References GetTotalAuraMultiplierByMiscMask(), SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, and SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE.

Referenced by Spell::DoAllEffectOnLaunchTarget(), AuraEffect::HandlePeriodicDamageAurasTick(), and spell_dk_death_and_decay::RecalculateDamage().

◆ CalculateDamage()

uint32 Unit::CalculateDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
uint8  itemDamagesMask = 0 
)
3019{
3020 float minDamage = 0.0f;
3021 float maxDamage = 0.0f;
3022
3023 if (normalized || !addTotalPct || itemDamagesMask)
3024 {
3025 // get both by default
3026 if (!itemDamagesMask)
3027 {
3028 itemDamagesMask = (1 << 0) | (1 << 1);
3029 }
3030
3031 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
3032 {
3033 if (itemDamagesMask & (1 << i))
3034 {
3035 float minTmp, maxTmp;
3036 CalculateMinMaxDamage(attType, normalized, addTotalPct, minTmp, maxTmp, i);
3037 minDamage += minTmp;
3038 maxDamage += maxTmp;
3039 }
3040 }
3041 }
3042 else
3043 {
3044 switch (attType)
3045 {
3046 case RANGED_ATTACK:
3049 break;
3050 case BASE_ATTACK:
3053 break;
3054 case OFF_ATTACK:
3057 break;
3058 default:
3059 break;
3060 }
3061 }
3062
3063 minDamage = std::max(0.f, minDamage);
3064 maxDamage = std::max(0.f, maxDamage);
3065
3066 if (minDamage > maxDamage)
3067 {
3068 std::swap(minDamage, maxDamage);
3069 }
3070
3071 return urand(uint32(minDamage), uint32(maxDamage));
3072}
@ UNIT_FIELD_MINDAMAGE
Definition: UpdateFields.h:127
@ UNIT_FIELD_MAXDAMAGE
Definition: UpdateFields.h:128
@ UNIT_FIELD_MAXOFFHANDDAMAGE
Definition: UpdateFields.h:130
@ UNIT_FIELD_MAXRANGEDDAMAGE
Definition: UpdateFields.h:169
@ UNIT_FIELD_MINRANGEDDAMAGE
Definition: UpdateFields.h:168
@ UNIT_FIELD_MINOFFHANDDAMAGE
Definition: UpdateFields.h:129
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:44
virtual void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0

References BASE_ATTACK, CalculateMinMaxDamage(), Object::GetFloatValue(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, UNIT_FIELD_MINRANGEDDAMAGE, and urand().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ CalculateDefaultCoefficient()

float Unit::CalculateDefaultCoefficient ( SpellInfo const *  spellInfo,
DamageEffectType  damagetype 
) const
17280{
17281 // Damage over Time spells bonus calculation
17282 float DotFactor = 1.0f;
17283 if (damagetype == DOT)
17284 {
17285 int32 DotDuration = spellInfo->GetDuration();
17286 if (!spellInfo->IsChanneled() && DotDuration > 0)
17287 DotFactor = DotDuration / 15000.0f;
17288
17289 if (uint32 DotTicks = spellInfo->GetMaxTicks())
17290 DotFactor /= DotTicks;
17291 }
17292
17293 int32 CastingTime = spellInfo->IsChanneled() ? spellInfo->GetDuration() : spellInfo->CalcCastTime();
17294 // Distribute Damage over multiple effects, reduce by AoE
17295 CastingTime = GetCastingTimeForBonus(spellInfo, damagetype, CastingTime);
17296
17297 // As wowwiki says: C = (Cast Time / 3.5)
17298 return (CastingTime / 3500.0f) * DotFactor;
17299}
@ DOT
Definition: Unit.h:251
uint32 GetCastingTimeForBonus(SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
Definition: Unit.cpp:17161

References SpellInfo::CalcCastTime(), DOT, GetCastingTimeForBonus(), SpellInfo::GetDuration(), SpellInfo::GetMaxTicks(), and SpellInfo::IsChanneled().

Referenced by SpellDamageBonusTaken().

◆ CalculateLevelPenalty()

float Unit::CalculateLevelPenalty ( SpellInfo const *  spellProto) const
3075{
3076 if (!IsPlayer())
3077 return 1.0f;
3078
3079 if (spellProto->SpellLevel <= 0 || spellProto->SpellLevel >= spellProto->MaxLevel)
3080 return 1.0f;
3081
3082 float LvlPenalty = 0.0f;
3083
3084 // xinef: added brackets
3085 if (spellProto->SpellLevel < 20)
3086 LvlPenalty = (20.0f - spellProto->SpellLevel) * 3.75f;
3087
3088 float LvlFactor = (float(spellProto->SpellLevel) + 6.0f) / float(GetLevel());
3089 if (LvlFactor > 1.0f)
3090 LvlFactor = 1.0f;
3091
3092 return AddPct(LvlFactor, -LvlPenalty);
3093}
uint8 GetLevel() const
Definition: Unit.h:1028

References AddPct(), GetLevel(), Object::IsPlayer(), SpellInfo::MaxLevel, and SpellInfo::SpellLevel.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellDamageBonusDone(), SpellDamageBonusTaken(), and SpellHealingBonusDone().

◆ CalculateMeleeDamage()

void Unit::CalculateMeleeDamage ( Unit victim,
CalcDamageInfo damageInfo,
WeaponAttackType  attackType = BASE_ATTACK,
const bool  sittingVictim = false 
)
1497{
1498 damageInfo->attacker = this;
1499 damageInfo->target = victim;
1500
1501 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1502 {
1503 damageInfo->damages[i].damageSchoolMask = GetMeleeDamageSchoolMask(attackType, i);
1504 damageInfo->damages[i].damage = 0;
1505 damageInfo->damages[i].absorb = 0;
1506 damageInfo->damages[i].resist = 0;
1507 }
1508
1509 damageInfo->attackType = attackType;
1510 damageInfo->cleanDamage = 0;
1511 damageInfo->blocked_amount = 0;
1512
1513 damageInfo->TargetState = 0;
1514 damageInfo->HitInfo = 0;
1515 damageInfo->procAttacker = PROC_FLAG_NONE;
1516 damageInfo->procVictim = PROC_FLAG_NONE;
1517 damageInfo->procEx = PROC_EX_NONE;
1518 damageInfo->hitOutCome = MELEE_HIT_EVADE;
1519
1520 if (!victim)
1521 return;
1522
1523 if (!IsAlive() || !victim->IsAlive())
1524 return;
1525
1526 // Select HitInfo/procAttacker/procVictim flag based on attack type
1527 switch (attackType)
1528 {
1529 case BASE_ATTACK:
1532 break;
1533 case OFF_ATTACK:
1536 damageInfo->HitInfo = HITINFO_OFFHAND;
1537 break;
1538 default:
1539 return;
1540 }
1541
1542 // School Immune check
1543 uint8 immunedMask = 0;
1544 bool hasNonPhysicalSchoolMask = false;
1545 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1546 {
1548 {
1549 immunedMask |= (1 << i);
1551 {
1552 hasNonPhysicalSchoolMask = true;
1553 }
1554 }
1555 }
1556
1557 // School Immune check
1558 if (immunedMask & ((1 << 0) | (1 << 1)))
1559 {
1560 if (hasNonPhysicalSchoolMask || immunedMask == ((1 << 0) | (1 << 1)))
1561 {
1562 damageInfo->HitInfo |= HITINFO_NORMALSWING;
1563 damageInfo->TargetState = VICTIMSTATE_IS_IMMUNE;
1564
1565 damageInfo->procEx |= PROC_EX_IMMUNE;
1566 return;
1567 }
1568 }
1569
1570 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1571 {
1572 // only players have secondary weapon damage
1573 if (i > 0 && !IsPlayer())
1574 {
1575 break;
1576 }
1577
1578 if (immunedMask & (1 << i))
1579 {
1580 continue;
1581 }
1582
1583 SpellSchoolMask schoolMask = SpellSchoolMask(damageInfo->damages[i].damageSchoolMask);
1584 bool const addPctMods = (schoolMask & SPELL_SCHOOL_MASK_NORMAL);
1585
1586 uint32 damage = 0;
1587 uint8 itemDamagesMask = (IsPlayer()) ? (1 << i) : 0;
1588
1589 damage += CalculateDamage(damageInfo->attackType, false, addPctMods, itemDamagesMask);
1590 // Add melee damage bonus
1591 damage = MeleeDamageBonusDone(damageInfo->target, damage, damageInfo->attackType, nullptr, schoolMask);
1592 damage = damageInfo->target->MeleeDamageBonusTaken(this, damage, damageInfo->attackType, nullptr, schoolMask);
1593
1594 // Script Hook For CalculateMeleeDamage -- Allow scripts to change the Damage pre class mitigation calculations
1595 sScriptMgr->ModifyMeleeDamage(damageInfo->target, damageInfo->attacker, damage);
1596
1597 if (victim->GetAI())
1598 {
1599 victim->GetAI()->OnCalculateMeleeDamageReceived(damage, this);
1600 }
1601
1602 // Calculate armor reduction
1604 {
1605 damageInfo->damages[i].damage = Unit::CalcArmorReducedDamage(this, damageInfo->target, damage, nullptr, 0, damageInfo->attackType);
1606 damageInfo->cleanDamage += damage - damageInfo->damages[i].damage;
1607 }
1608 else
1609 {
1610 damageInfo->damages[i].damage = damage;
1611 }
1612 }
1613
1614 damageInfo->hitOutCome = RollMeleeOutcomeAgainst(damageInfo->target, damageInfo->attackType);
1615
1616 // If the victim was a sitting player and we didn't roll a miss, then crit.
1617 if (sittingVictim && damageInfo->hitOutCome != MELEE_HIT_MISS)
1618 {
1619 damageInfo->hitOutCome = MELEE_HIT_CRIT;
1620 }
1621 switch (damageInfo->hitOutCome)
1622 {
1623 case MELEE_HIT_EVADE:
1625 damageInfo->TargetState = VICTIMSTATE_EVADES;
1626 damageInfo->procEx |= PROC_EX_EVADE;
1627
1628 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1629 {
1630 damageInfo->damages[i].damage = 0;
1631 }
1632
1633 damageInfo->cleanDamage = 0;
1634 return;
1635 case MELEE_HIT_MISS:
1636 damageInfo->HitInfo |= HITINFO_MISS;
1637 damageInfo->TargetState = VICTIMSTATE_INTACT;
1638 damageInfo->procEx |= PROC_EX_MISS;
1639
1640 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1641 {
1642 damageInfo->damages[i].damage = 0;
1643 }
1644 damageInfo->cleanDamage = 0;
1645 break;
1646 case MELEE_HIT_NORMAL:
1647 damageInfo->TargetState = VICTIMSTATE_HIT;
1648 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1649 break;
1650 case MELEE_HIT_CRIT:
1651 {
1652 damageInfo->HitInfo |= HITINFO_CRITICALHIT;
1653 damageInfo->TargetState = VICTIMSTATE_HIT;
1654
1655 damageInfo->procEx |= PROC_EX_CRITICAL_HIT;
1656 // Crit bonus calc
1657 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1658 {
1659 damageInfo->damages[i].damage *= 2;
1660
1661 float mod = 0.0f;
1662 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1663 if (damageInfo->attackType == RANGED_ATTACK)
1664 {
1666 }
1667 else
1668 {
1670
1671 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1673 }
1674
1675 uint32 crTypeMask = damageInfo->target->GetCreatureTypeMask();
1676
1677 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1679 if (mod != 0)
1680 {
1681 AddPct(damageInfo->damages[i].damage, mod);
1682 }
1683 }
1684 break;
1685 }
1686 case MELEE_HIT_PARRY:
1687 damageInfo->TargetState = VICTIMSTATE_PARRY;
1688 damageInfo->procEx |= PROC_EX_PARRY;
1689 damageInfo->cleanDamage = 0;
1690
1691 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1692 {
1693 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1694 damageInfo->damages[i].damage = 0;
1695 }
1696 break;
1697 case MELEE_HIT_DODGE:
1698 damageInfo->TargetState = VICTIMSTATE_DODGE;
1699 damageInfo->procEx |= PROC_EX_DODGE;
1700 damageInfo->cleanDamage = 0;
1701
1702 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1703 {
1704 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1705 damageInfo->damages[i].damage = 0;
1706 }
1707 break;
1708 case MELEE_HIT_BLOCK:
1709 {
1710 damageInfo->TargetState = VICTIMSTATE_HIT;
1711 damageInfo->HitInfo |= HITINFO_BLOCK;
1712 damageInfo->procEx |= PROC_EX_BLOCK;
1713 damageInfo->blocked_amount = damageInfo->target->GetShieldBlockValue();
1714 // double blocked amount if block is critical
1715 if (damageInfo->target->isBlockCritical())
1716 damageInfo->blocked_amount += damageInfo->blocked_amount;
1717
1718 uint32 remainingBlock = damageInfo->blocked_amount;
1719 uint8 fullBlockMask = 0;
1720 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1721 {
1722 if (remainingBlock && remainingBlock >= damageInfo->damages[i].damage)
1723 {
1724 fullBlockMask |= (1 << i);
1725
1726 remainingBlock -= damageInfo->damages[i].damage;
1727 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1728 damageInfo->damages[i].damage = 0;
1729 }
1730 else
1731 {
1732 damageInfo->cleanDamage += remainingBlock;
1733 damageInfo->damages[i].damage -= remainingBlock;
1734 remainingBlock = 0;
1735 }
1736 }
1737
1738 // full block
1739 if (fullBlockMask == ((1 << 0) | (1 << 1)))
1740 {
1741 damageInfo->TargetState = VICTIMSTATE_BLOCKS;
1742 damageInfo->procEx |= PROC_EX_FULL_BLOCK;
1743 damageInfo->blocked_amount -= remainingBlock;
1744 }
1745 break;
1746 }
1747 case MELEE_HIT_GLANCING:
1748 {
1749 damageInfo->HitInfo |= HITINFO_GLANCING;
1750 damageInfo->TargetState = VICTIMSTATE_HIT;
1751 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1752 int32 leveldif = int32(victim->GetLevel()) - int32(GetLevel());
1753 if (leveldif > 3)
1754 leveldif = 3;
1755 float reducePercent = 1 - leveldif * 0.1f;
1756
1757 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1758 {
1759 uint32 reducedDamage = uint32(reducePercent * damageInfo->damages[i].damage);
1760 damageInfo->cleanDamage += damageInfo->damages[i].damage - reducedDamage;
1761 damageInfo->damages[i].damage = reducedDamage;
1762 }
1763 break;
1764 }
1765 case MELEE_HIT_CRUSHING:
1766 damageInfo->HitInfo |= HITINFO_CRUSHING;
1767 damageInfo->TargetState = VICTIMSTATE_HIT;
1768 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1769
1770 // 150% normal damage
1771 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1772 {
1773 damageInfo->damages[i].damage += (damageInfo->damages[i].damage / 2);
1774 }
1775 break;
1776 default:
1777 break;
1778 }
1779
1780 // Always apply HITINFO_AFFECTS_VICTIM in case its not a miss
1781 if (!(damageInfo->HitInfo & HITINFO_MISS))
1782 damageInfo->HitInfo |= HITINFO_AFFECTS_VICTIM;
1783
1784 uint32 tmpHitInfo[MAX_ITEM_PROTO_DAMAGES] = { };
1785
1786 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1787 {
1788 int32 dmg = damageInfo->damages[i].damage;
1789 int32 cleanDamage = damageInfo->cleanDamage;
1790 // attackType is checked already for BASE_ATTACK or OFF_ATTACK so it can't be RANGED_ATTACK here
1791 if (CanApplyResilience())
1792 {
1793 int32 resilienceReduction = damageInfo->damages[i].damage;
1794 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, (damageInfo->hitOutCome == MELEE_HIT_CRIT), CR_CRIT_TAKEN_MELEE);
1795
1796 resilienceReduction = damageInfo->damages[i].damage - resilienceReduction;
1797 dmg -= resilienceReduction;
1798 cleanDamage += resilienceReduction;
1799 }
1800
1801 damageInfo->damages[i].damage = std::max(0, dmg);
1802 damageInfo->cleanDamage = std::max(0, cleanDamage);
1803
1804 // Calculate absorb resist
1805 if (damageInfo->damages[i].damage > 0)
1806 {
1807 damageInfo->procVictim |= PROC_FLAG_TAKEN_DAMAGE;
1808
1809 // Calculate absorb & resists
1810 DamageInfo dmgInfo(*damageInfo, i);
1811 Unit::CalcAbsorbResist(dmgInfo);
1812 damageInfo->damages[i].absorb = dmgInfo.GetAbsorb();
1813 damageInfo->damages[i].resist = dmgInfo.GetResist();
1814
1815 if (damageInfo->damages[i].absorb)
1816 {
1817 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].absorb == 0 ? HITINFO_FULL_ABSORB : HITINFO_PARTIAL_ABSORB);
1818 }
1819
1820 if (damageInfo->damages[i].resist)
1821 {
1822 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].resist == 0 ? HITINFO_FULL_RESIST : HITINFO_PARTIAL_RESIST);
1823 }
1824
1825 damageInfo->damages[i].damage = dmgInfo.GetDamage();
1826 }
1827 }
1828
1829 // set proper HitInfo flags
1830 if ((tmpHitInfo[0] & HITINFO_FULL_ABSORB) != 0)
1831 {
1832 // set partial absorb when secondary damage isn't full absorbed
1833 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_ABSORB) != 0) ? HITINFO_PARTIAL_ABSORB : HITINFO_FULL_ABSORB;
1834 }
1835 else
1836 {
1837 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_ABSORB);
1838 }
1839
1840 if ((tmpHitInfo[0] & HITINFO_FULL_RESIST) != 0)
1841 {
1842 // set partial resist when secondary damage isn't full resisted
1843 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_RESIST) != 0) ? HITINFO_PARTIAL_RESIST : HITINFO_FULL_RESIST;
1844 }
1845 else
1846 {
1847 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_RESIST);
1848 }
1849
1851 {
1852 damageInfo->procEx |= PROC_EX_ABSORB;
1853 }
1854
1855 if (damageInfo->HitInfo & HITINFO_FULL_RESIST)
1856 {
1857 damageInfo->procEx |= PROC_EX_RESIST;
1858 }
1859}
@ PROC_EX_NONE
Definition: SpellMgr.h:193
@ PROC_EX_DODGE
Definition: SpellMgr.h:198
@ PROC_EX_BLOCK
Definition: SpellMgr.h:200
@ PROC_EX_CRITICAL_HIT
Definition: SpellMgr.h:195
@ PROC_EX_MISS
Definition: SpellMgr.h:196
@ PROC_EX_RESIST
Definition: SpellMgr.h:197
@ PROC_EX_FULL_BLOCK
Definition: SpellMgr.h:207
@ PROC_EX_ABSORB
Definition: SpellMgr.h:204
@ PROC_EX_PARRY
Definition: SpellMgr.h:199
@ PROC_EX_EVADE
Definition: SpellMgr.h:201
@ PROC_FLAG_DONE_MELEE_AUTO_ATTACK
Definition: SpellMgr.h:110
@ PROC_FLAG_DONE_MAINHAND_ATTACK
Definition: SpellMgr.h:140
@ PROC_FLAG_TAKEN_DAMAGE
Definition: SpellMgr.h:137
@ PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK
Definition: SpellMgr.h:111
@ PROC_FLAG_DONE_OFFHAND_ATTACK
Definition: SpellMgr.h:141
@ PROC_FLAG_NONE
Definition: SpellMgr.h:105
@ SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
Definition: SpellAuraDefines.h:232
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE
Definition: SpellAuraDefines.h:267
@ SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
Definition: SpellAuraDefines.h:226
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
Definition: SpellAuraDefines.h:266
@ VICTIMSTATE_INTACT
Definition: Unit.h:84
@ VICTIMSTATE_HIT
Definition: Unit.h:85
@ VICTIMSTATE_DODGE
Definition: Unit.h:86
@ VICTIMSTATE_IS_IMMUNE
Definition: Unit.h:91
@ VICTIMSTATE_PARRY
Definition: Unit.h:87
@ VICTIMSTATE_BLOCKS
Definition: Unit.h:89
@ VICTIMSTATE_EVADES
Definition: Unit.h:90
@ HITINFO_PARTIAL_ABSORB
Definition: Unit.h:104
@ HITINFO_FULL_RESIST
Definition: Unit.h:105
@ HITINFO_NORMALSWING
Definition: Unit.h:97
@ HITINFO_BLOCK
Definition: Unit.h:111
@ HITINFO_CRUSHING
Definition: Unit.h:115
@ HITINFO_SWINGNOHITSOUND
Definition: Unit.h:119
@ HITINFO_MISS
Definition: Unit.h:102
@ HITINFO_FULL_ABSORB
Definition: Unit.h:103
@ HITINFO_OFFHAND
Definition: Unit.h:100
@ HITINFO_GLANCING
Definition: Unit.h:114
@ HITINFO_CRITICALHIT
Definition: Unit.h:107
@ HITINFO_PARTIAL_RESIST
Definition: Unit.h:106
@ HITINFO_AFFECTS_VICTIM
Definition: Unit.h:99
@ MELEE_HIT_CRUSHING
Definition: Unit.h:287
@ MELEE_HIT_BLOCK
Definition: Unit.h:286
@ MELEE_HIT_CRIT
Definition: Unit.h:287
@ MELEE_HIT_EVADE
Definition: Unit.h:286
@ MELEE_HIT_DODGE
Definition: Unit.h:286
@ MELEE_HIT_MISS
Definition: Unit.h:286
@ MELEE_HIT_PARRY
Definition: Unit.h:286
@ MELEE_HIT_GLANCING
Definition: Unit.h:287
virtual void OnCalculateMeleeDamageReceived(uint32 &, Unit *)
Called during damage calculations.
Definition: UnitAI.h:380
uint32 damageSchoolMask
Definition: Unit.h:470
uint32 blocked_amount
Definition: Unit.h:476
MeleeHitOutcome hitOutCome
Definition: Unit.h:485
uint32 cleanDamage
Definition: Unit.h:484
uint32 TargetState
Definition: Unit.h:478
uint32 resist
Definition: Unit.h:473
bool isBlockCritical()
Definition: Unit.cpp:3160
uint32 MeleeDamageBonusTaken(Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition: Unit.cpp:13370
virtual SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:6057
bool CanApplyResilience() const
Definition: Unit.h:1097
uint32 CalculateDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
Definition: Unit.cpp:3018
virtual uint32 GetShieldBlockValue() const =0
static void ApplyResilience(Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
Definition: Unit.cpp:19024
UnitAI * GetAI()
Definition: Unit.h:648
static bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
Definition: Unit.cpp:2040
int32 GetTotalAuraModifier(AuraType auratype) const
Definition: Unit.cpp:6006
MeleeHitOutcome RollMeleeOutcomeAgainst(Unit const *victim, WeaponAttackType attType) const
Definition: Unit.cpp:2817
uint32 GetCreatureTypeMask() const
Definition: Unit.h:780
uint32 MeleeDamageBonusDone(Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition: Unit.cpp:13168

References CalcDamageInfo::absorb, AddPct(), CalcDamageInfo::attacker, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcArmorReducedDamage(), CalculateDamage(), CalcDamageInfo::cleanDamage, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, GetAI(), GetCreatureTypeMask(), GetLevel(), GetMeleeDamageSchoolMask(), GetShieldBlockValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplierByMiscMask(), CalcDamageInfo::HitInfo, HITINFO_AFFECTS_VICTIM, HITINFO_BLOCK, HITINFO_CRITICALHIT, HITINFO_CRUSHING, HITINFO_GLANCING, HITINFO_MISS, HITINFO_NORMALSWING, HITINFO_OFFHAND, HITINFO_SWINGNOHITSOUND, CalcDamageInfo::hitOutCome, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, MeleeDamageBonusDone(), MeleeDamageBonusTaken(), OFF_ATTACK, UnitAI::OnCalculateMeleeDamageReceived(), PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_EVADE, PROC_EX_FULL_BLOCK, PROC_EX_IMMUNE, PROC_EX_MISS, PROC_EX_NONE, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_MELEE_AUTO_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_NONE, PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK, CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RANGED_ATTACK, CalcDamageInfo::resist, RollMeleeOutcomeAgainst(), SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_SCHOOL_MASK_NORMAL, sScriptMgr, CalcDamageInfo::target, CalcDamageInfo::TargetState, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, VICTIMSTATE_EVADES, VICTIMSTATE_HIT, VICTIMSTATE_INTACT, VICTIMSTATE_IS_IMMUNE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ CalculateMinMaxDamage()

virtual void Unit::CalculateMinMaxDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
float &  minDamage,
float &  maxDamage,
uint8  damageIndex = 0 
)
pure virtual

Implemented in Creature, and Player.

Referenced by CalculateDamage(), and UpdateDamagePhysical().

◆ CalculateSpellDamage()

int32 Unit::CalculateSpellDamage ( Unit const *  target,
SpellInfo const *  spellProto,
uint8  effect_index,
int32 const *  basePoints = nullptr 
) const

◆ CalculateSpellDamageTaken()

void Unit::CalculateSpellDamageTaken ( SpellNonMeleeDamage damageInfo,
int32  damage,
SpellInfo const *  spellInfo,
WeaponAttackType  attackType = BASE_ATTACK,
bool  crit = false 
)
1328{
1329 if (damage < 0)
1330 return;
1331
1332 Unit* victim = damageInfo->target;
1333 if (!victim || !victim->IsAlive())
1334 return;
1335
1336 SpellSchoolMask damageSchoolMask = SpellSchoolMask(damageInfo->schoolMask);
1337 uint32 crTypeMask = victim->GetCreatureTypeMask();
1338
1339 // Script Hook For CalculateSpellDamageTaken -- Allow scripts to change the Damage post class mitigation calculations
1340 sScriptMgr->ModifySpellDamageTaken(damageInfo->target, damageInfo->attacker, damage, spellInfo);
1341
1342 if (victim->GetAI())
1343 {
1344 victim->GetAI()->OnCalculateSpellDamageReceived(damage, this);
1345 }
1346
1347 int32 cleanDamage = 0;
1348 if (Unit::IsDamageReducedByArmor(damageSchoolMask, spellInfo))
1349 {
1350 int32 oldDamage = damage;
1351 damage = Unit::CalcArmorReducedDamage(this, victim, damage, spellInfo, 0, attackType);
1352 cleanDamage = oldDamage - damage;
1353 }
1354
1355 bool blocked = false;
1356 // Per-school calc
1357 switch (spellInfo->DmgClass)
1358 {
1359 // Melee and Ranged Spells
1362 {
1363 // Physical Damage
1364 if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)
1365 {
1366 // Get blocked status
1367 blocked = isSpellBlocked(victim, spellInfo, attackType);
1368 }
1369
1370 if (crit)
1371 {
1372 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1373
1374 // Calculate crit bonus
1375 uint32 crit_bonus = damage;
1376 // Apply crit_damage bonus for melee spells
1377 if (Player* modOwner = GetSpellModOwner())
1378 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
1379 damage += crit_bonus;
1380
1381 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1382 float critPctDamageMod = 0.0f;
1383 if (attackType == RANGED_ATTACK)
1385 else
1387
1388 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1389 critPctDamageMod += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellInfo->GetSchoolMask());
1390
1391 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1393
1394 if (critPctDamageMod != 0)
1395 AddPct(damage, critPctDamageMod);
1396 }
1397
1398 // Spell weapon based damage CAN BE crit & blocked at same time
1399 if (blocked)
1400 {
1401 damageInfo->blocked = victim->GetShieldBlockValue();
1402 // double blocked amount if block is critical
1403 if (victim->isBlockCritical())
1404 damageInfo->blocked *= 2;
1405 if (damage < int32(damageInfo->blocked))
1406 damageInfo->blocked = uint32(damage);
1407
1408 damage -= damageInfo->blocked;
1409 cleanDamage += damageInfo->blocked;
1410 }
1411
1412 int32 resilienceReduction = damage;
1413 if (CanApplyResilience())
1414 {
1415 if (attackType != RANGED_ATTACK)
1416 {
1417 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_MELEE);
1418 }
1419 else
1420 {
1421 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_RANGED);
1422 }
1423 }
1424
1425 resilienceReduction = damage - resilienceReduction;
1426 damage -= resilienceReduction;
1427 cleanDamage += resilienceReduction;
1428 break;
1429 }
1430 // Magical Attacks
1433 {
1434 // If crit add critical bonus
1435 if (crit)
1436 {
1437 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1438 damage = Unit::SpellCriticalDamageBonus(this, spellInfo, damage, victim);
1439 }
1440
1441 int32 resilienceReduction = damage;
1442 if (CanApplyResilience())
1443 {
1444 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_SPELL);
1445 }
1446
1447 resilienceReduction = damage - resilienceReduction;
1448 damage -= resilienceReduction;
1449 cleanDamage += resilienceReduction;
1450 break;
1451 }
1452 default:
1453 break;
1454 }
1455
1456 damageInfo->cleanDamage = std::max(0, cleanDamage);
1457 damageInfo->damage = std::max(0, damage);
1458
1459 // Calculate absorb resist
1460 if (damageInfo->damage > 0)
1461 {
1462 DamageInfo dmgInfo(*damageInfo, SPELL_DIRECT_DAMAGE);
1463 Unit::CalcAbsorbResist(dmgInfo);
1464 damageInfo->absorb = dmgInfo.GetAbsorb();
1465 damageInfo->resist = dmgInfo.GetResist();
1466 damageInfo->damage = dmgInfo.GetDamage();
1467 }
1468}
@ SPELLMOD_CRIT_DAMAGE_BONUS
Definition: SpellDefines.h:91
@ SPELL_DIRECT_DAMAGE
Definition: Unit.h:250
@ SPELL_DAMAGE_CLASS_RANGED
Definition: SharedDefines.h:1559
@ SPELL_DAMAGE_CLASS_MAGIC
Definition: SharedDefines.h:1557
@ SPELL_DAMAGE_CLASS_NONE
Definition: SharedDefines.h:1556
@ SPELL_DAMAGE_CLASS_MELEE
Definition: SharedDefines.h:1558
@ SPELL_HIT_TYPE_CRIT
Definition: SharedDefines.h:1547
virtual void OnCalculateSpellDamageReceived(int32 &, Unit *)
Definition: UnitAI.h:381
Unit * target
Definition: Unit.h:496
uint32 HitInfo
Definition: Unit.h:507
uint32 damage
Definition: Unit.h:499
uint32 absorb
Definition: Unit.h:502
Unit * attacker
Definition: Unit.h:497
uint32 schoolMask
Definition: Unit.h:501
uint32 cleanDamage
Definition: Unit.h:509
uint32 resist
Definition: Unit.h:503
uint32 blocked
Definition: Unit.h:506
bool isSpellBlocked(Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
Definition: Unit.cpp:3134
static uint32 SpellCriticalDamageBonus(Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
Definition: Unit.cpp:12374

References SpellNonMeleeDamage::absorb, AddPct(), ApplyResilience(), SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CalcAbsorbResist(), CalcArmorReducedDamage(), CanApplyResilience(), SpellNonMeleeDamage::cleanDamage, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, SpellNonMeleeDamage::damage, SpellInfo::DmgClass, DamageInfo::GetAbsorb(), GetAI(), GetCreatureTypeMask(), DamageInfo::GetDamage(), DamageInfo::GetResist(), SpellInfo::GetSchoolMask(), GetShieldBlockValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), isSpellBlocked(), UnitAI::OnCalculateSpellDamageReceived(), RANGED_ATTACK, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_DIRECT_DAMAGE, SPELL_HIT_TYPE_CRIT, SPELL_SCHOOL_MASK_NORMAL, SpellCriticalDamageBonus(), SPELLMOD_CRIT_DAMAGE_BONUS, sScriptMgr, and SpellNonMeleeDamage::target.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ CanApplyResilience()

bool Unit::CanApplyResilience ( ) const
inline

◆ CanDualWield()

◆ CanEnterWater()

virtual bool Unit::CanEnterWater ( ) const
pure virtual

Implemented in Creature, and Player.

◆ CanFly()

◆ CanFreeMove()

bool Unit::CanFreeMove ( ) const
inline
1640 {
1643 }
@ UNIT_STATE_DISTRACTED
Definition: UnitDefines.h:182
@ UNIT_STATE_CONFUSED
Definition: UnitDefines.h:181
@ UNIT_STATE_FLEEING
Definition: UnitDefines.h:177
@ UNIT_STATE_IN_FLIGHT
Definition: UnitDefines.h:178
@ UNIT_STATE_STUNNED
Definition: UnitDefines.h:173

References GetOwnerGUID(), HasUnitState(), UNIT_STATE_CONFUSED, UNIT_STATE_DISTRACTED, UNIT_STATE_FLEEING, UNIT_STATE_IN_FLIGHT, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by Creature::IsFreeToMove().

◆ CanHaveThreatList()

bool Unit::CanHaveThreatList ( bool  skipAliveCheck = false) const
14716{
14717 // only creatures can have threat list
14718 if (!IsCreature())
14719 return false;
14720
14721 // only alive units can have threat list
14722 if (!skipAliveCheck && !IsAlive())
14723 return false;
14724
14725 // totems can not have threat list
14726 if (ToCreature()->IsTotem())
14727 return false;
14728
14729 // vehicles can not have threat list
14730 if (ToCreature()->IsVehicle() && GetMap()->IsBattlegroundOrArena())
14731 return false;
14732
14733 // summons can not have a threat list, unless they are controlled by a creature
14735 return false;
14736
14737 return true;
14738}
@ UNIT_MASK_CONTROLLABLE_GUARDIAN
Definition: UnitDefines.h:164
@ UNIT_MASK_GUARDIAN
Definition: UnitDefines.h:158
Map * GetMap() const
Definition: Object.h:621
bool IsVehicle() const
Definition: Unit.h:752

References WorldObject::GetMap(), GetOwnerGUID(), HasUnitTypeMask(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), IsTotem(), IsVehicle(), Object::ToCreature(), UNIT_MASK_CONTROLLABLE_GUARDIAN, UNIT_MASK_GUARDIAN, and UNIT_MASK_MINION.

Referenced by AddThreat(), Creature::CanPeriodicallyCallForAssistance(), ThreatMgr::ClearAllThreat(), DealDamage(), ScriptedAI::DoResetThreatList(), CreatureAI::DoZoneInCombat(), Spell::EffectTaunt(), Spell::EffectThreat(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleModTaunt(), Spell::HandleThreatSpells(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), Creature::SelectVictim(), TauntApply(), TauntFadeOut(), and Update().

◆ CanInstantCast()

bool Unit::CanInstantCast ( ) const
inline
1508{ return _instantCast; }

References _instantCast.

Referenced by ModSpellCastTime().

◆ CanModifyStats()

◆ CanProc()

bool Unit::CanProc ( )
inline
1478{ return !m_procDeep; }

References m_procDeep.

Referenced by Spell::DoAllEffectOnTarget().

◆ CanRestoreMana()

bool Unit::CanRestoreMana ( SpellInfo const *  spellInfo) const
21093{
21094 // Aura of Despair exceptions
21095 switch (spellInfo->Id)
21096 {
21097 case 16666: // Demonic Rune
21098 case 27869: // Dark Rune
21099 case 30824: // Shamanistic Rage
21100 case 31786: // Spiritual Attunement
21101 case 31930: // Judgements of the Wise
21102 case 34075: // Aspect of the Viper
21103 case 34720: // Thrill of the hunt
21104 case 47755: // Rapture
21105 case 54425: // Improved Felhunter
21106 case 57319: // Blessing of Sanctuary
21107 case 63337: // Saronite Vapors (regenerate mana)
21108 case 63375: // Improved stormstrike
21109 case 64372: // Lifebloom
21110 case 68285: // Improved Leader of the Pack
21111 return true;
21112 case 54428: // Divine Plea - only with talent Guarded by the Light
21113 return HasSpell(53583);
21114 default:
21115 break;
21116 }
21117
21118 return false;
21119}
virtual bool HasSpell(uint32) const
Definition: Unit.h:1503

References HasSpell(), and SpellInfo::Id.

Referenced by IsImmunedToSpellEffect().

◆ CanSparringWith()

bool Unit::CanSparringWith ( Unit const *  attacker) const
protected
3993{
3995 return false;
3996
3997 if (!attacker)
3998 return false;
3999
4000 if (!attacker->IsCreature() || attacker->IsCharmedOwnedByPlayerOrPlayer())
4001 return false;
4002
4003 if (Creature const* creature = ToCreature())
4004 if (!creature->GetSparringPct())
4005 return false;
4006
4007 return true;
4008}
bool IsCharmedOwnedByPlayerOrPlayer() const
Definition: Unit.h:1238

References IsCharmedOwnedByPlayerOrPlayer(), Object::IsCreature(), and Object::ToCreature().

Referenced by AttackerStateUpdate(), and DealDamage().

◆ CanSwim()

bool Unit::CanSwim ( ) const
virtual

this method checks the current flag of a unit

These flags can be set within the database or dynamically changed at runtime UNIT_FLAG_SWIMMING must be updated when a unit enters a swimmable area

Reimplemented in Creature.

19796{
19797 // Mirror client behavior, if this method returns false then client will not use swimming animation and for players will apply gravity as if there was no water
19799 return false;
19801 return true;
19803 return false;
19805 return true;
19807}
@ UNIT_FLAG2_UNUSED_6
Definition: UnitDefines.h:309
@ UNIT_FLAG_CANNOT_SWIM
Definition: UnitDefines.h:266
@ UNIT_FLAG_POSSESSED
Definition: UnitDefines.h:276
@ UNIT_FLAG_SWIMMING
Definition: UnitDefines.h:267
@ UNIT_FLAG_RENAME
Definition: UnitDefines.h:256
@ UNIT_FLAG_PET_IN_COMBAT
Definition: UnitDefines.h:263
bool HasUnitFlag2(UnitFlags2 flags) const
Definition: Unit.h:708

References HasUnitFlag(), HasUnitFlag2(), UNIT_FLAG2_UNUSED_6, UNIT_FLAG_CANNOT_SWIM, UNIT_FLAG_PET_IN_COMBAT, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_POSSESSED, UNIT_FLAG_RENAME, and UNIT_FLAG_SWIMMING.

Referenced by Creature::CanSwim().

◆ CanUseAttackType()

◆ CastCustomSpell() [1/5]

SpellCastResult Unit::CastCustomSpell ( SpellInfo const *  spellInfo,
CustomSpellValues const &  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1290{
1291 SpellCastTargets targets;
1292 targets.SetUnitTarget(victim);
1293
1294 return CastSpell(targets, spellInfo, &value, triggerFlags, castItem, triggeredByAura, originalCaster);
1295}
Definition: Spell.h:119
void SetUnitTarget(Unit *target)
Definition: Spell.cpp:239

References CastSpell(), and SpellCastTargets::SetUnitTarget().

◆ CastCustomSpell() [2/5]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
CustomSpellValues const &  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1278{
1279 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1280 if (!spellInfo)
1281 {
1282 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1284 }
1285
1286 return CastCustomSpell(spellInfo, value, victim, triggerFlags, castItem, triggeredByAura, originalCaster);
1287}
@ SPELL_FAILED_SPELL_UNAVAILABLE
Definition: SharedDefines.h:1067
#define LOG_ERROR(filterType__,...)
Definition: Log.h:158
SpellCastResult CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1251

References CastCustomSpell(), Object::GetGUID(), LOG_ERROR, SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastCustomSpell() [3/5]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1264{
1265 CustomSpellValues values;
1266 values.AddSpellMod(mod, value);
1267 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1268}
@ TRIGGERED_NONE
Definition: SpellDefines.h:133
Definition: SpellDefines.h:165
void AddSpellMod(SpellValueMod mod, int32 value)
Definition: SpellDefines.h:167

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastCustomSpell() [4/5]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1271{
1272 CustomSpellValues values;
1273 values.AddSpellMod(mod, value);
1274 return CastCustomSpell(spellId, values, target, triggerFlags, castItem, triggeredByAura, originalCaster);
1275}

References CustomSpellValues::AddSpellMod(), and CastCustomSpell().

◆ CastCustomSpell() [5/5]

SpellCastResult Unit::CastCustomSpell ( Unit victim,
uint32  spellId,
int32 const *  bp0,
int32 const *  bp1,
int32 const *  bp2,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1252{
1253 CustomSpellValues values;
1254 if (bp0)
1255 values.AddSpellMod(SPELLVALUE_BASE_POINT0, *bp0);
1256 if (bp1)
1257 values.AddSpellMod(SPELLVALUE_BASE_POINT1, *bp1);
1258 if (bp2)
1259 values.AddSpellMod(SPELLVALUE_BASE_POINT2, *bp2);
1260 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1261}
@ SPELLVALUE_BASE_POINT1
Definition: SpellDefines.h:114
@ SPELLVALUE_BASE_POINT2
Definition: SpellDefines.h:115
@ SPELLVALUE_BASE_POINT0
Definition: SpellDefines.h:113

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), SPELLVALUE_BASE_POINT0, SPELLVALUE_BASE_POINT1, SPELLVALUE_BASE_POINT2, TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

Referenced by spell_pri_guardian_spirit::Absorb(), spell_mage_fire_frost_ward::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_the_lich_king_necrotic_plague_jump_aura::AfterDispel(), spell_dru_lifebloom::AfterRemove(), Player::ApplyEnchantment(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), npc_gas_cloud::npc_gas_cloudAI::CastMainSpell(), CastPetAura(), spell_ruby_sanctum_rallying_shout::CountAllies(), spell_igb_rocket_artillery_explosion::DamageGunship(), boss_illidari_council_memberAI::DamageTaken(), boss_tenris_mirkblood::DamageTaken(), boss_leotheras_the_blind::DemonTime(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), boss_krik_thir::boss_krik_thirAI::DoAction(), Spell::EffectDestroyAllTotems(), Spell::EffectDispel(), Spell::EffectFeedPet(), Spell::EffectForceCast(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonType(), EnterVehicle(), EnterVehicleUnattackable(), AuraMunchingQueue::Execute(), TriggerWickedSpirit::Execute(), spell_sha_totem_of_wrath::HandleAfterCast(), spell_reflective_shield_aura::HandleAfterEffectAbsorb(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_pri_shadow_word_death::HandleDamage(), spell_dk_corpse_explosion::HandleDamage(), spell_dru_lifebloom::HandleDispel(), spell_igb_burning_pitch::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_deathbringer_blood_link::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_gen_dummy_trigger::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_pal_divine_storm_dummy::HandleDummy(), spell_sha_ancestral_awakening_proc::HandleDummy(), spell_sha_cleansing_totem_pulse::HandleDummy(), spell_warl_life_tap::HandleDummy(), spell_warr_last_stand::HandleDummy(), spell_warr_charge::HandleDummy(), spell_warr_slam::HandleDummy(), spell_warr_bloodthirst::HandleDummy(), HandleDummyAuraProc(), spell_egg_explosion::HandleDummyHitTarget(), spell_warr_execute::HandleEffect(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_serpentshrine_cavern_infection::HandleEffectRemove(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_ragin_flames_inferno::HandlePeriodic(), spell_dk_death_and_decay_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_deathbringer_blood_link_aura::HandleProc(), spell_deathbringer_blood_link_blood_beast_aura::HandleProc(), spell_soul_deflection::HandleProc(), spell_reliquary_of_souls_aura_of_desire_aura::HandleProc(), spell_black_temple_consuming_strikes_aura::HandleProc(), spell_item_blade_ward_enchant::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), spell_dru_living_seed_proc::HandleProc(), spell_hun_ascpect_of_the_viper::HandleProc(), spell_sha_earth_shield::HandleProc(), spell_the_lich_king_dark_hunger_aura::HandleProc(), spell_yogg_saron_grim_reprisal_aura::HandleProc(), spell_dk_wandering_plague_aura::HandleProc(), spell_dk_blood_gorged::HandleProc(), spell_dru_living_seed::HandleProc(), spell_gen_blade_warding::HandleProc(), spell_hun_glyph_of_arcane_shot::HandleProc(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_item_necrotic_touch::HandleProc(), spell_mage_burnout::HandleProc(), spell_pal_seal_of_command_aura::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pal_seal_of_righteousness::HandleProc(), spell_pri_divine_aegis::HandleProc(), spell_pri_glyph_of_prayer_of_healing::HandleProc(), spell_rog_blade_flurry::HandleProc(), spell_sha_item_mana_surge::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellWithValueAuraProc(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_igb_rocket_pack_aura::HandleRemove(), spell_warl_haunt_aura::HandleRemove(), spell_pal_lay_on_hands::HandleScript(), spell_kelthuzad_detonate_mana_aura::HandleScript(), spell_gluth_decimate::HandleScriptEffect(), spell_hun_chimera_shot::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), spell_illidari_council_circle_of_healing::HandleSharedRule(), HandleSpellClick(), spell_halion_damage_aoe_summon::HandleSummon(), spell_putricide_mutated_transformation::HandleSummon(), spell_putricide_mutated_plague_aura::HandleTriggerSpell(), boss_sathrovarr::JustEngagedWith(), boss_essence_of_suffering::boss_essence_of_sufferingAI::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_felblood_kaelthas::JustEngagedWith(), boss_kalecgos::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_najentus::JustEngagedWith(), boss_morogrim_tidewalker::JustEngagedWith(), boss_felmyst::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_janalai_hatcher::MovementInform(), npc_frost_tomb::npc_frost_tomb(), spell_dru_tiger_s_fury::OnHit(), spell_gen_flurry_of_claws::OnPeriodic(), spell_blood_queen_essence_of_the_blood_queen_aura::OnProc(), spell_pal_eye_for_an_eye::OnProc(), spell_warl_siphon_life::OnProc(), spell_warl_fel_synergy::OnProc(), spell_warr_improved_spell_reflection::OnProc(), spell_warr_damage_shield::OnProc(), spell_kalecgos_curse_of_boundless_agony_aura::OnRemove(), spell_halion_marks_aura::OnRemove(), spell_putricide_mutated_plague_aura::OnRemove(), spell_the_lich_king_necrotic_plague_aura::OnRemove(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), spell_sindragosa_instability_aura::OnRemove(), spell_the_lich_king_necrotic_plague_jump_aura::OnRemove(), spell_karazhan_overload_aura::PeriodicTick(), spell_entropius_negative_energy_periodic::PeriodicTick(), spell_doomfire::PeriodicTick(), spell_blood_queen_pact_of_the_darkfallen_dmg_aura::PeriodicTick(), spell_broggok_poison_cloud::PeriodicTick(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11198_take_down_tethyr::PrepareSpellScript(), spell_illidari_council_reflective_shield_aura::ReflectDamage(), spell_pri_power_word_shield_aura::ReflectDamage(), boss_kiljaeden::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), boss_kiljaeden::ScheduleBasicAbilities(), boss_magtheridon::ScheduleCombatEvents(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), boss_viscidus::SummonedCreatureDies(), spell_dk_anti_magic_shell_self::Trigger(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), spell_the_lich_king_life_siphon::TriggerHeal(), spell_pal_divine_storm::TriggerHeal(), spell_black_temple_shadow_inferno_aura::Update(), spell_black_temple_spell_absorption_aura::Update(), npc_coren_direbrew::UpdateAI(), boss_huhuran::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_living_constellation::npc_living_constellationAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), and boss_toravon::boss_toravonAI::UpdateAI().

◆ CastDelayedSpellWithPeriodicAmount()

void Unit::CastDelayedSpellWithPeriodicAmount ( Unit caster,
uint32  spellId,
AuraType  auraType,
int32  addAmount,
uint8  effectIndex = 0 
)
20155{
20156 AuraEffect* aurEff = nullptr;
20157 for (AuraEffectList::iterator i = m_modAuras[auraType].begin(); i != m_modAuras[auraType].end(); ++i)
20158 {
20159 aurEff = *i;
20160 if (aurEff->GetCasterGUID() != caster->GetGUID() || aurEff->GetId() != spellId || aurEff->GetEffIndex() != effectIndex || !aurEff->GetTotalTicks())
20161 continue;
20162
20163 addAmount += ((aurEff->GetOldAmount() * std::max<int32>(aurEff->GetTotalTicks() - int32(aurEff->GetTickNumber()), 0)) / aurEff->GetTotalTicks());
20164 break;
20165 }
20166
20167 // xinef: delay only for casting on different unit
20168 if (this == caster || !sWorld->getBoolConfig(CONFIG_MUNCHING_BLIZZLIKE))
20169 caster->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, addAmount, this, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_NO_PERIODIC_RESET), nullptr, aurEff, caster->GetGUID());
20170 else
20171 caster->m_Events.AddEvent(new AuraMunchingQueue(*caster, GetGUID(), addAmount, spellId, aurEff, auraType), caster->m_Events.CalculateQueueTime(400));
20172}
TriggerCastFlags
Definition: SpellDefines.h:132
@ TRIGGERED_NO_PERIODIC_RESET
Will ignore equipped item requirements.
Definition: SpellDefines.h:152
@ CONFIG_MUNCHING_BLIZZLIKE
Definition: WorldConfig.h:143
uint64 CalculateQueueTime(uint64 delay) const
Definition: EventProcessor.cpp:164
Definition: Unit.cpp:20103
uint32 GetTickNumber() const
Definition: SpellAuraEffects.h:87
int32 GetOldAmount() const
Definition: SpellAuraEffects.h:117
uint32 GetId() const
Definition: SpellAuraEffects.cpp:433
int32 GetTotalTicks() const
Definition: SpellAuraEffects.cpp:7383
ObjectGuid GetCasterGUID() const
Definition: SpellAuraEffects.h:48

References EventProcessor::AddEvent(), EventProcessor::CalculateQueueTime(), CastCustomSpell(), CONFIG_MUNCHING_BLIZZLIKE, AuraEffect::GetCasterGUID(), AuraEffect::GetEffIndex(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetOldAmount(), AuraEffect::GetTickNumber(), AuraEffect::GetTotalTicks(), WorldObject::m_Events, m_modAuras, SPELLVALUE_BASE_POINT0, sWorld, TRIGGERED_FULL_MASK, and TRIGGERED_NO_PERIODIC_RESET.

Referenced by HandleDummyAuraProc(), spell_mage_ignite::HandleProc(), spell_dru_t10_balance_4p_bonus::HandleProc(), spell_sha_t10_restoration_4p_bonus::HandleProc(), spell_sha_t8_electrified::HandleProc(), and HandleProcTriggerSpell().

◆ CastPetAura()

void Unit::CastPetAura ( PetAura const *  aura)
17405{
17406 uint32 auraId = aura->GetAura(GetEntry());
17407 if (!auraId)
17408 return;
17409
17410 if (auraId == 35696) // Demonic Knowledge
17411 {
17412 int32 basePoints = aura->GetDamage();
17413 CastCustomSpell(this, auraId, &basePoints, nullptr, nullptr, true);
17414 }
17415 else
17416 CastSpell(this, auraId, true);
17417}

References CastCustomSpell(), CastSpell(), PetAura::GetAura(), PetAura::GetDamage(), and Object::GetEntry().

Referenced by Pet::CastPetAuras().

◆ CastSpell() [1/7]

SpellCastResult Unit::CastSpell ( float  x,
float  y,
float  z,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1298{
1299 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1300 if (!spellInfo)
1301 {
1302 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1304 }
1305
1306 SpellCastTargets targets;
1307 targets.SetDst(x, y, z, GetOrientation());
1308
1309 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1310}
void SetDst(float x, float y, float z, float orientation, uint32 mapId=MAPID_INVALID)
Definition: Spell.cpp:406

References CastSpell(), Object::GetGUID(), Position::GetOrientation(), LOG_ERROR, SpellCastTargets::SetDst(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [2/7]

SpellCastResult Unit::CastSpell ( GameObject go,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1313{
1314 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1315 if (!spellInfo)
1316 {
1317 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1319 }
1320
1321 SpellCastTargets targets;
1322 targets.SetGOTarget(go);
1323
1324 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1325}
void SetGOTarget(GameObject *target)
Definition: Spell.cpp:271

References CastSpell(), Object::GetGUID(), LOG_ERROR, SpellCastTargets::SetGOTarget(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [3/7]

SpellCastResult Unit::CastSpell ( SpellCastTargets const &  targets,
SpellInfo const *  spellInfo,
CustomSpellValues const *  value,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
Todo:
: this is a workaround - not needed anymore, but required for some scripts :(
1195{
1196 if (!spellInfo)
1197 {
1198 LOG_ERROR("entities.unit", "CastSpell: unknown spell by caster {}", GetGUID().ToString());
1200 }
1201
1203 if (!originalCaster && triggeredByAura)
1204 {
1205 originalCaster = triggeredByAura->GetCasterGUID();
1206 }
1207
1208 Spell* spell = new Spell(this, spellInfo, triggerFlags, originalCaster);
1209
1210 if (value)
1211 {
1212 for (CustomSpellValues::const_iterator itr = value->begin(); itr != value->end(); ++itr)
1213 {
1214 spell->SetSpellValue(itr->first, itr->second);
1215 }
1216 }
1217
1218 spell->m_CastItem = castItem;
1219 return spell->prepare(&targets, triggeredByAura);
1220}
void SetSpellValue(SpellValueMod mod, int32 value)
Definition: Spell.cpp:8387
Item * m_CastItem
Definition: Spell.h:532

References AuraEffect::GetCasterGUID(), Object::GetGUID(), LOG_ERROR, Spell::m_CastItem, Spell::prepare(), Spell::SetSpellValue(), SPELL_FAILED_SPELL_UNAVAILABLE, and Position::ToString().

Referenced by Player::_addSpell(), Player::_addTalentAurasAndSpells(), Spell::_cast(), _ExitVehicle(), Player::_LoadGlyphAuras(), Battleground::_ProcessResurrect(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_rog_cheat_death::Absorb(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Activate(), Player::ActivateSpec(), spell_halion_combustion_consumption_aura::AddMarkStack(), Battleground::AddPlayer(), Arena::AddPlayer(), BattlegroundIC::AddPlayer(), BattlegroundMap::AddPlayerToMap(), Battleground::AddPlayerToResurrectQueue(), Pet::addSpell(), spell_dru_barkskin::AfterApply(), spell_dru_savage_roar_aura::AfterApply(), spell_astromancer_wrath_of_the_astromancer::AfterRemove(), spell_gen_lifebloom::AfterRemove(), spell_oculus_stop_time_aura::Apply(), spell_sha_earthbind_totem::Apply(), spell_warl_health_funnel::ApplyEffect(), Player::ApplyEnchantment(), Player::ApplyEquipSpell(), Player::ApplyItemObtainSpells(), spell_hun_lock_and_load::ApplyMarker(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::boss_yoggsaron_crusher_tentacleAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::boss_yoggsaron_death_orbAI(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::boss_yoggsaron_influence_tentacleAI(), WorldState::BuffAdalsSongOfBattle(), WorldState::BuffMagtheridonTeam(), Player::BuildPlayerRepop(), spell_igb_incinerating_blast::CalculateDamage(), spell_igb_cannon_blast::CalculatePower(), npc_echo_of_medivh::CastChangeFacing(), npc_chesspiece::CastChangeFacing(), CastCustomSpell(), npc_hallows_end_soh::CastFires(), Player::CastItemCombatSpell(), npc_volatile_ooze::npc_volatile_oozeAI::CastMainSpell(), CastPetAura(), boss_mor_grayhoof::CastRandomSpell(), GameObject::CastSpell(), CastSpell(), spell_the_lich_king_defile::ChangeDamageAndGrow(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), spell_eredar_twins_handle_touch::CheckCast(), Spell::CheckItems(), spell_botanica_shift_form_aura::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), spell_the_lich_king_shadow_trap_periodic::CheckTargetCount(), spell_dk_raise_dead::ConsumeReagents(), spell_frost_giant_death_plague::CountTargets(), instance_blackrock_spire::instance_blackrock_spireMapScript::CreatureLooted(), violet_hold_trashAI::CreatureStartAttackDoor(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_jenny::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), DealMeleeDamage(), spell_warl_seed_of_corruption_aura::Detonate(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_twin_valkyrAI::DoAction(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_icc_severed_essence::npc_icc_severed_essenceAI::DoAction(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), npc_eris_hevenfire::npc_eris_hevenfireAI::DoAction(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_flame_leviathan::boss_flame_leviathanAI::DoAction(), boss_magtheridon::DoAction(), boss_sacrolash::DoAction(), boss_alythess::DoAction(), npc_kalecgos_kj::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_black_knight::boss_black_knightAI::DoAction(), boss_jormungarAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_icc_blood_beast::npc_icc_blood_beastAI::DoAction(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_molten_golem::npc_molten_golemAI::DoAction(), boss_steelbreaker::boss_steelbreakerAI::DoAction(), npc_ulduar_bot_summon_trigger::npc_ulduar_bot_summon_triggerAI::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DoAction(), boss_yoggsaron_keeper::DoAction(), Spell::DoAllEffectOnTarget(), UnitAI::DoCast(), UnitAI::DoCastAOE(), ScriptedAI::DoCastSpell(), InstanceScript::DoCastSpellOnPlayer(), InstanceScript::DoCastSpellOnPlayers(), UnitAI::DoCastToAllHostilePlayers(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), npc_midsummer_ribbon_pole_target::DoFireworkChecks(), npc_midsummer_ribbon_pole_target::DoGroundFlowerChecks(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), npc_midsummer_ribbon_pole_target::DoSpewLavaChecks(), boss_skeram::DoTeleport(), Spell::DoTriggersOnSpellHit(), Player::DuelComplete(), Spell::EffectActivateRune(), Spell::EffectApplyGlyph(), Spell::EffectCastButtons(), Spell::EffectDummy(), Spell::EffectEnergize(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectInebriate(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectStuck(), Spell::EffectSummonType(), Spell::EffectTaunt(), Spell::EffectTeleportUnits(), Spell::EffectTitanGrip(), Spell::EffectTriggerMissileSpell(), Spell::EffectTriggerRitualOfSummoning(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::EmpowerCultist(), boss_the_lich_king::boss_the_lich_kingAI::EnterEvadeMode(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), BattlegroundEY::EventTeamCapturedPoint(), BattleExperienceEvent::Execute(), OrcDeathEvent::Execute(), CorruptTriggers::Execute(), CastArmageddon::Execute(), UtherBatteredHiltEvent::Execute(), ShockVortexExplodeEvent::Execute(), ResetEncounterEvent::Execute(), FrostBombExplosion::Execute(), IceTombSummonEvent::Execute(), VileSpiritActivateEvent::Execute(), LichKingMovieEvent::Execute(), DelayedCastEvent::Execute(), DelayedCastMincharEvent::Execute(), ChargeRifts::Execute(), CosmicSmashDamageEvent::Execute(), CastRunesEvent::Execute(), BoomEvent::Execute(), SACActivateEvent::Execute(), VerasEnvenom::Execute(), CastQuill::Execute(), lapseTeleport::Execute(), boss_kaelthas::ExecuteMiddleEvent(), boss_salramm::boss_salrammAI::ExplodeGhoul(), spell_festergut_blighted_spores_aura::ExtraEffect(), spell_rotface_mutated_infection_aura::ExtraRemoveEffect(), npc_dark_iron_attack_generator::FinishAttackDueToWin(), npc_azure_saboteur::npc_azure_saboteurAI::FinishPointReached(), npc_pet_dk_ebon_gargoyle::FlyAway(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::GoSiphon(), go_soulwell::go_soulwellAI::GossipHello(), spell_cataclysm_breath::HandleAfterCast(), spell_dk_chains_of_ice::HandleAfterCast(), spell_mage_arcane_blast::HandleAfterCast(), spell_q13086_last_line_of_defence::HandleAfterCast(), spell_braziers_hit::HandleAfterEffectApply(), spell_infected_worgen_bite_aura::HandleAfterEffectApply(), spell_dk_blood_boil::HandleAfterHit(), spell_dk_scourge_strike::HandleAfterHit(), spell_rog_deadly_poison::HandleAfterHit(), spell_warlords_rage::HandleAfterRemove(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), spell_felmyst_fog_of_corruption_charm_aura::HandleApply(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleApply(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), spell_dru_enrage::HandleApply(), spell_rog_killing_spree_aura::HandleApply(), spell_warr_vigilance::HandleApply(), spell_azjol_nerub_pound::HandleApplyAura(), BattlegroundIC::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_dk_death_grip::HandleBaseDummy(), misc_commandscript::HandleBindSightCommand(), spell_mirkblood_dash_gash_return_to_tank_pre_spell::HandleCast(), spell_rotface_unstable_ooze_explosion_init::HandleCast(), spell_commander_sarannis_summon_reinforcements::HandleCast(), cast_commandscript::HandleCastBackCommand(), cast_commandscript::HandleCastCommand(), cast_commandscript::HandleCastDestCommand(), cast_commandscript::HandleCastDistCommand(), cast_commandscript::HandleCastSelfCommand(), cast_commandscript::HandleCastTargetCommad(), spell_gen_mounted_charge::HandleChargeEffect(), spell_dk_corpse_explosion::HandleCorpseExplosion(), OutdoorPvPSI::HandleCustomSpell(), WorldSession::HandleDuelCancelledOpcode(), spell_icc_shattered_bones::HandleDummy(), spell_corrupted_totems::HandleDummy(), spell_moroes_vanish::HandleDummy(), spell_karazhan_blink::HandleDummy(), spell_karazhan_wrath_titans_stacker::HandleDummy(), spell_ooze_zap::HandleDummy(), spell_saviana_conflagration_init::HandleDummy(), spell_igb_burning_pitch_selector::HandleDummy(), spell_igb_burning_pitch::HandleDummy(), spell_charge_shield_bomber::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_anti_air_rocket_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_illidan_found_target::HandleDummy(), spell_leotheras_chaos_blast::HandleDummy(), spell_morogrim_tidewalker_watery_grave::HandleDummy(), spell_q10935_the_exorcism_of_colonel_jules::HandleDummy(), spell_gen_focused_bursts::HandleDummy(), spell_shadowblink::HandleDummy(), spell_spawn_drakonid::HandleDummy(), spell_send_mug_target_picker::HandleDummy(), spell_hallows_end_candy::HandleDummy(), spell_hallows_end_bucket_lands::HandleDummy(), spell_midsummer_torch_catch::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_mana_burn_area::HandleDummy(), spell_voljin_war_drums::HandleDummy(), spell_voodoo::HandleDummy(), spell_sartharion_lava_strike::HandleDummy(), spell_halion_meteor_strike_targeting::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_drakkari_colossus_emerge::HandleDummy(), spell_drakkari_colossus_surge::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_voa_flaming_cinder::HandleDummy(), spell_q12096_q12092_dummy::HandleDummy(), spell_vehicle_warhead_fuse::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_najentus_needle_spine::HandleDummy(), spell_ice_spear_target_picker::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), spell_gen_cannibalize::HandleDummy(), spell_gen_gadgetzan_transporter_backfire::HandleDummy(), spell_gen_gnomish_transporter::HandleDummy(), spell_hun_masters_call::HandleDummy(), spell_hun_pet_carrion_feeder::HandleDummy(), spell_item_gnomish_universal_remote::HandleDummy(), spell_item_gnomish_shrink_ray::HandleDummy(), spell_item_trigger_spell::HandleDummy(), spell_item_deviate_fish::HandleDummy(), spell_item_flask_of_the_north::HandleDummy(), spell_item_make_a_wish::HandleDummy(), spell_item_mingos_fortune_generator::HandleDummy(), spell_item_net_o_matic::HandleDummy(), spell_item_noggenfogger_elixir::HandleDummy(), spell_item_savory_deviate_delight::HandleDummy(), spell_item_six_demon_bag::HandleDummy(), spell_item_underbelly_elixir::HandleDummy(), spell_item_vanquished_clutches::HandleDummy(), spell_item_purify_helboar_meat::HandleDummy(), spell_item_reindeer_transformation::HandleDummy(), spell_item_nigh_invulnerability::HandleDummy(), spell_item_poultryizer::HandleDummy(), spell_item_socrethars_stone::HandleDummy(), spell_item_demon_broiled_surprise::HandleDummy(), spell_item_complete_raptor_capture::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), spell_item_nitro_boots::HandleDummy(), spell_item_teach_language::HandleDummy(), spell_item_rocket_boots::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_item_greatmothers_soulcatcher::HandleDummy(), spell_mage_summon_water_elemental::HandleDummy(), spell_pal_blessing_of_faith::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pal_judgement_of_command::HandleDummy(), spell_pri_penance::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q5206_test_fetid_skull::HandleDummy(), spell_q11396_11399_scourging_crystal_controller::HandleDummy(), spell_q11587_arcane_prisoner_rescue::HandleDummy(), spell_q11730_ultrasonic_screwdriver::HandleDummy(), spell_q12634_despawn_fruit_tosser::HandleDummy(), spell_q12683_take_sputum_sample::HandleDummy(), spell_q9452_cast_net::HandleDummy(), spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy::HandleDummy(), spell_q12308_escape_from_silverbrook::HandleDummy(), spell_q12641_death_comes_from_on_high::HandleDummy(), spell_rog_shiv::HandleDummy(), spell_sha_fire_nova::HandleDummy(), spell_warl_ritual_of_doom_effect::HandleDummy(), spell_warl_soulshatter::HandleDummy(), spell_warr_charge::HandleDummy(), spell_magtheridon_shadow_grasp::HandleDummyApply(), HandleDummyAuraProc(), spell_yogg_saron_destabilization_matrix::HandleDummyEffect(), spell_yogg_saron_insane_periodic_trigger::HandleDummyEffect(), spell_image_of_drakuru_reagent_check::HandleDummyEffect(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_talon_king_ikiss_blink::HandleDummyHitTarget(), spell_shadowfang_keep_forsaken_skills_aura::HandleDummyTick(), spell_item_rocket_chicken::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_shadowfang_keep_haunting_spirits_aura::HandleDummyTick(), spell_blood_council_shadow_prison_aura::HandleDummyTick(), spell_mark_of_nature::HandleEffect(), spell_call_of_the_beast::HandleEffect(), spell_target_fissures::HandleEffect(), spell_rog_vanish::HandleEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_lich_king_vo_blocker::HandleEffectApply(), spell_midsummer_ribbon_pole::HandleEffectApply(), spell_tharon_ja_dummy_aura::HandleEffectApply(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_leotheras_insidious_whisper_aura::HandleEffectApply(), spell_serpentshrine_cavern_coilfang_water::HandleEffectApply(), spell_q12851_going_bearback::HandleEffectApply(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_gen_whisper_gulch_yogg_saron_whisper::HandleEffectPeriodic(), spell_rog_killing_spree_aura::HandleEffectPeriodic(), spell_sha_earthbind_totem::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_warr_retaliation::HandleEffectProc(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_trigger_aura::HandleEffectRemove(), spell_teron_gorefiend_shadow_of_death::HandleEffectRemove(), spell_black_temple_skeleton_shot_aura::HandleEffectRemove(), spell_hydross_cleansing_field_command::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite_trigger_aura::HandleEffectRemove(), spell_q10930_big_bone_worm_aura::HandleEffectRemove(), spell_q10929_fumping_aura::HandleEffectRemove(), spell_flamewreath::HandleFinish(), spell_midsummer_fling_torch::HandleFinish(), spell_midsummer_juggling_torch::HandleFinish(), spell_wintergrasp_rp_gg::HandleFinish(), spell_dreamwalker_summoner::HandleForceCast(), spell_dreamwalker_summon_suppresser_effect::HandleForceCast(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), OPvPCapturePointZM_Graveyard::HandleGossipOption(), spell_item_crazy_alchemists_potion::HandleHeal(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), spell_magtheridon_quake::HandleHit(), spell_chapter5_return_to_capital::HandleHit(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), OutdoorPvPHP::HandleKillImpl(), OutdoorPvPNA::HandleKillImpl(), OutdoorPvPZM::HandleKillImpl(), BattlegroundIC::HandleKillUnit(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_ticking_time_bomb_aura::HandleOnEffectRemove(), spell_delusions_of_jindo::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), spell_mark_of_frost_freeze::HandleOnHit(), spell_mutate_explode_bug::HandleOnHit(), spell_explode_trigger::HandleOnHit(), spell_blade_dance_targeting::HandleOnHit(), HandleOverrideClassScriptAuraProc(), aura_class_call_wild_magic::HandlePeriodic(), spell_shadow_sickle_periodic_damage::HandlePeriodic(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_halion_meteor_strike_spread_aura::HandlePeriodic(), spell_sladran_grip_of_sladran_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_close_rift_aura::HandlePeriodic(), spell_serpentshrine_cavern_coilfang_water::HandlePeriodic(), spell_rancid_spore_cloud::HandlePeriodic(), spell_kaelthas_remote_toy::HandlePeriodic(), spell_q10923_evil_draws_near_periodic_aura::HandlePeriodic(), spell_sha_totemic_mastery::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_kiljaeden_shadow_spike_aura::HandlePeriodic(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), spell_halion_twilight_cutter_periodic_aura::HandlePeriodic(), spell_oculus_ride_ruby_emerald_amber_drake_que_aura::HandlePeriodic(), spell_hun_sniper_training::HandlePeriodic(), spell_shadow_bolt_whirl::HandlePeriodic(), spell_voa_overcharge_aura::HandlePeriodicDummy(), AuraEffect::HandlePeriodicDummyAuraTick(), spell_magtheridon_shadow_grasp::HandlePeriodicRemove(), spell_igb_periodic_trigger_with_power_cost_aura::HandlePeriodicTick(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), spell_bronjahm_soulstorm_channel_ooc_aura::HandlePeriodicTick(), spell_bronjahm_soulstorm_visual_aura::HandlePeriodicTick(), spell_item_direbrew_remote_aura::HandlePeriodicTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceMoveByAI(), WorldState::HandlePlayerEnterZone(), OutdoorPvPEP::HandlePlayerEnterZone(), OutdoorPvPHP::HandlePlayerEnterZone(), OutdoorPvPNA::HandlePlayerEnterZone(), OutdoorPvPSI::HandlePlayerEnterZone(), OutdoorPvPTF::HandlePlayerEnterZone(), OutdoorPvPZM::HandlePlayerEnterZone(), WorldSession::HandlePlayerLoginFromDB(), BattlegroundIC::HandlePlayerResurrect(), misc_commandscript::HandlePossessCommand(), spell_blood_queen_vampiric_bite::HandlePresence(), spell_mark_of_malice::HandleProc(), spell_item_lil_phylactery::HandleProc(), spell_item_fate_rune_of_unsurpassed_vigor::HandleProc(), spell_mage_burning_determination::HandleProc(), spell_rog_tricks_of_the_trade::HandleProc(), spell_gyth_chromatic_protection::HandleProc(), spell_karazhan_wrath_titans_aura::HandleProc(), spell_ahune_spanky_hands::HandleProc(), spell_item_trauma::HandleProc(), spell_item_shadows_fate::HandleProc(), spell_utgarde_pinnacle_beast_mark::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_hun_improved_mend_pet::HandleProc(), spell_hun_misdirection::HandleProc(), spell_item_aegis_of_preservation::HandleProc(), spell_item_desperate_defense::HandleProc(), spell_mage_focus_magic::HandleProc(), spell_pal_blessing_of_sanctuary::HandleProc(), spell_pri_item_greater_heal_refund::HandleProc(), spell_pri_mana_leech::HandleProc(), spell_warr_vigilance::HandleProc(), spell_karazhan_temptation::HandleProc(), spell_dk_blood_caked_blade::HandleProc(), spell_dk_dancing_rune_weapon::HandleProc(), spell_gen_moss_covered_feet::HandleProc(), spell_item_unsated_craving::HandleProc(), spell_item_shadowmourne::HandleProc(), spell_sha_item_lightning_shield::HandleProc(), spell_sha_item_lightning_shield_trigger::HandleProc(), spell_warl_glyph_of_shadowflame::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), spell_hun_lock_and_load::HandleProcs(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellAuraProc(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), AuraEffect::HandleRaidProcFromChargeAuraProc(), spell_dk_raise_dead::HandleRaiseDead(), spell_vael_burning_adrenaline::HandleRemove(), spell_kiljaeden_darkness_aura::HandleRemove(), spell_entropius_void_zone_visual_aura::HandleRemove(), spell_igb_rocket_pack_aura::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_gen_mine_sweeper::HandleSchoolDMG(), spell_warl_shadowflame::HandleSchoolDMG(), spell_gen_bandage::HandleScript(), spell_gen_translocate::HandleScript(), spell_pal_lay_on_hands::HandleScript(), spell_kormok_summon_bone_mages::HandleScript(), spell_kormok_summon_bone_minions::HandleScript(), spell_energize_aoe::HandleScript(), spell_saviana_conflagration_throwback::HandleScript(), spell_taldaram_glittering_sparks::HandleScript(), spell_blood_queen_bloodbolt::HandleScript(), spell_blood_queen_presence_of_the_darkfallen::HandleScript(), spell_igb_rocket_artillery::HandleScript(), spell_putricide_unstable_experiment::HandleScript(), spell_sindragosa_icy_grip::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_summon_spirit_bomb::HandleScript(), spell_dreamwalker_summon_portal::HandleScript(), spell_dreamwalker_twisted_nightmares::HandleScript(), spell_archavon_rock_shards::HandleScript(), spell_wintergrasp_portal::HandleScript(), spell_gen_create_lance::HandleScript(), spell_item_defibrillate::HandleScript(), spell_item_scroll_of_recall::HandleScript(), spell_shazzrah_gate_dummy::HandleScript(), spell_apothecary_lingering_fumes::HandleScript(), spell_apothecary_validate_area::HandleScript(), spell_apothecary_throw_cologne::HandleScript(), spell_apothecary_throw_perfume::HandleScript(), spell_hallows_end_trick::HandleScript(), spell_hallows_end_put_costume::HandleScript(), spell_hallows_end_trick_or_treat::HandleScript(), spell_winter_veil_mistletoe::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_moam_summon_mana_fiends::HandleScript(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), spell_mistress_kiss_area::HandleScript(), spell_novos_summon_minions::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_choking_gas_bomb::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_the_lich_king_cast_back_to_caster::HandleScript(), spell_frost_giant_death_plague::HandleScript(), spell_yogg_saron_target_selectors::HandleScript(), spell_the_black_stalker_levitate::HandleScript(), spell_the_black_stalker_levitation_pulse::HandleScript(), spell_the_black_stalker_someone_grab_me::HandleScript(), spell_the_black_stalker_magnetic_pull::HandleScript(), spell_the_flag_of_ownership::HandleScript(), spell_gen_elune_candle::HandleScript(), spell_gen_teleporting::HandleScript(), spell_gen_dalaran_disguise::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_item_dimensional_ripper_area52::HandleScript(), spell_item_eggnog::HandleScript(), spell_q12805_lifeblood_dummy::HandleScript(), spell_q12735_song_of_cleansing::HandleScript(), spell_q13011_bear_flank_master::HandleScript(), spell_q12619_emblazon_runeblade_effect::HandleScript(), spell_q12919_gymers_throw::HandleScript(), spell_kalecgos_spectral_realm_dummy::HandleScriptEffect(), spell_marrowgar_coldflame_bonestorm::HandleScriptEffect(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_black_temple_bloodbolt::HandleScriptEffect(), spell_lady_vashj_summon_sporebat::HandleScriptEffect(), spell_kaelthas_summon_weapons::HandleScriptEffect(), spell_kaelthas_gravity_lapse::HandleScriptEffect(), spell_kaelthas_nether_beam::HandleScriptEffect(), spell_gen_clone::HandleScriptEffect(), spell_gen_clone_weapon::HandleScriptEffect(), spell_gen_break_shield::HandleScriptEffect(), spell_gen_mounted_charge::HandleScriptEffect(), spell_gen_throw_shield::HandleScriptEffect(), spell_item_sleepy_willy::HandleScriptEffect(), spell_item_lil_xt::HandleScriptEffect(), spell_q12698_the_gift_that_keeps_on_giving::HandleScriptEffect(), spell_death_knight_initiate_visual::HandleScriptEffect(), spell_summon_amanishi_sentries::HandleScriptEffect(), spell_brewfest_toss_mug::HandleScriptEffect(), spell_direbrew_summon_mole_machine_target_picker::HandleScriptEffect(), spell_request_second_mug::HandleScriptEffect(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), spell_azjol_drain_power::HandleScriptEffect(), spell_dtk_summon_random_drakkari::HandleScriptEffect(), spell_marrowgar_coldflame::HandleScriptEffect(), spell_arcane_chains_character_force_cast::HandleScriptEffect(), spell_dragonblight_devour_ghoul::HandleScriptEffect(), spell_hawk_hunting::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), spell_black_temple_summon_shadowfiends::HandleScriptEffect(), spell_ice_bombardment_dest_picker::HandleScriptEffect(), spell_kaelthas_remove_enchanted_weapons::HandleScriptEffect(), spell_kaelthas_kael_explodes::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_hun_masters_call::HandleScriptEffect(), spell_item_mirrens_drinking_hat::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), spell_q1846_bending_shinbone::HandleScriptEffect(), spell_q14112_14145_chum_the_water::HandleScriptEffect(), WorldSession::HandleSelfResOpcode(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), HandleSpellClick(), spell_marrowgar_bone_spike_graveyard::HandleSpikes(), AuraEffect::HandleSpiritOfRedemption(), spell_gen_paralytic_poison::HandleStun(), spell_putricide_mutated_transformation::HandleSummon(), spell_item_draenic_pale_ale::HandleSummon(), WorldSession::HandleTalentWipeConfirmOpcode(), spell_mother_shahraz_fatal_attraction::HandleTeleportUnits(), spell_warl_drain_soul::HandleTick(), WorldSession::HandleTrainerBuySpellOpcode(), spell_trigger_spell_from_caster::HandleTrigger(), spell_magic_eater_food::HandleTriggerSpell(), spell_alert_drums::HandleTriggerSpell(), spell_winter_veil_racer_rocket_slam::HandleTriggerSpell(), spell_pal_righteous_defense::HandleTriggerSpellHit(), boss_onyxia::HandleWhelpSpam(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), boss_ichoron::boss_ichoronAI::IchoronDoCastToAllHostilePlayers(), spell_q10769_dissension_amongst_the_ranks_aura::if(), CharmInfo::InitCharmCreateSpells(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InitFight(), npc_jenny::Initialize(), boss_urok_doomhowl::boss_urok_doomhowlAI::InitializeAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::InitializeAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::InitializeAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::InitializeAI(), boss_gal_darah::boss_gal_darahAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), CharmInfo::InitPossessCreateSpells(), Guardian::InitStatsForLevel(), Totem::InitSummon(), boss_faction_championsAI::IsCCed(), npc_living_inferno::npc_living_infernoAI::IsSummonedBy(), TriggerAI::IsSummonedBy(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_bone_spike::npc_bone_spikeAI::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_pet_gen_fetch_ball::IsSummonedBy(), npc_hallows_end_soh::JustDied(), boss_rajaxx::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), npc_swarm_scarab::npc_swarm_scarabAI::JustDied(), npc_phantom_hallucination::npc_phantom_hallucinationAI::JustDied(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::JustDied(), npc_gunship::npc_gunshipAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::JustDied(), boss_steelbreaker::boss_steelbreakerAI::JustDied(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_freya_summons::boss_freya_summonsAI::JustDied(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::JustDied(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::JustDied(), boss_skarvald_the_constructor::JustDied(), boss_dalronn_the_controller::JustDied(), npc_ichor_globule::npc_ichor_globuleAI::JustDied(), boss_fathomguard_sharkkis::JustDied(), boss_fathomguard_tidalvess::JustDied(), boss_fathomguard_caribdis::JustDied(), npc_necropolis_health::JustDied(), npc_necrotic_shard::JustDied(), CombatAI::JustDied(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_tharon_ja::boss_tharon_jaAI::JustDied(), boss_sapphiron::boss_sapphironAI::JustDied(), boss_anomalus::JustDied(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), boss_shade_of_akama::JustDied(), CasterAI::JustEngagedWith(), boss_servant_quarters::JustEngagedWith(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::JustEngagedWith(), boss_akilzon::JustEngagedWith(), npc_hallows_end_soh::JustEngagedWith(), boss_eadric::boss_eadricAI::JustEngagedWith(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustEngagedWith(), boss_twin_valkyrAI::JustEngagedWith(), boss_garfrost::boss_garfrostAI::JustEngagedWith(), npc_stinky_icc::npc_stinky_iccAI::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), npc_rimefang::npc_rimefangAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_freya_summons::boss_freya_summonsAI::JustEngagedWith(), boss_vezax::boss_vezaxAI::JustEngagedWith(), boss_hodir::boss_hodirAI::JustEngagedWith(), boss_thorim::boss_thorimAI::JustEngagedWith(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustEngagedWith(), boss_koralon::boss_koralonAI::JustEngagedWith(), boss_toravon::boss_toravonAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustEngagedWith(), boss_moragg::boss_moraggAI::JustEngagedWith(), boss_watchkeeper_gargolmar::JustEngagedWith(), boss_gatewatcher_gyrokill::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), CombatAI::JustEngagedWith(), boss_yauj::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_moorabi::boss_moorabiAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), boss_sapphiron::boss_sapphironAI::JustEngagedWith(), boss_keristrasza::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_fathomlord_karathress::JustEngagedWith(), boss_fathomguard_sharkkis::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustReachedHome(), boss_bronjahm::boss_bronjahmAI::JustReachedHome(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustReachedHome(), boss_gal_darah::boss_gal_darahAI::JustReachedHome(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::JustReachedHome(), boss_freya::boss_freyaAI::JustSummoned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_skeram::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_ragnaros::boss_ragnarosAI::JustSummoned(), boss_vexallus::JustSummoned(), boss_kiljaeden::JustSummoned(), npc_kalecgos_kj::JustSummoned(), boss_jindo::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_taldaram::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_gal_darah::boss_gal_darahAI::JustSummoned(), boss_prince_valanar_icc::boss_prince_valanarAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::JustSummoned(), boss_malygos::boss_malygosAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_svala::boss_svalaAI::JustSummoned(), boss_shirrak_the_dead_watcher::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), boss_grandmaster_vorpil::JustSummoned(), boss_gurtogg_bloodboil::JustSummoned(), boss_veras_darkshadow::JustSummoned(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::JustSummoned(), boss_supremus::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), npc_pallid_horror::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::JustSummoned(), boss_ayamiss::JustSummoned(), Kill(), boss_azuregos::boss_azuregosAI::KilledUnit(), boss_anubrekhan::boss_anubrekhanAI::KilledUnit(), boss_doomwalker::KilledUnit(), npc_dark_iron_guzzler::KilledUnit(), boss_steelbreaker::boss_steelbreakerAI::KilledUnit(), emerald_dragonAI::KilledUnit(), boss_emeriss::boss_emerissAI::KilledUnit(), boss_felblood_kaelthas::LapseAction(), spell_mandokir_charge::LaunchHit(), Player::learnQuestRewardedSpells(), spell_taldaram_summon_flame_ball::Load(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_brewfest_keg_thrower::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_love_in_air_snivel::MoveInLineOfSight(), boss_temporus::MoveInLineOfSight(), npc_medivh_bm::MoveInLineOfSight(), npc_jenny::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_spirit_shade::npc_spirit_shadeAI::MovementInform(), npc_unworthy_initiate::npc_unworthy_initiateAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_eck::boss_eckAI::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), boss_malygos::boss_malygosAI::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::MovementInform(), boss_headless_horseman::MovementInform(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::MovementInform(), npc_ashtongue_sorcerer::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), npc_wild_wyrm::npc_wild_wyrmAI::MovementInform(), boss_kagani_nightstrike::MovementInform(), npc_dark_iron_guzzler::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_assembly_lightning::npc_assembly_lightningAI::MovementInform(), boss_ymiron::boss_ymironAI::MovementInform(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), BattlegroundAB::NodeOccupied(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::npc_algalon_worm_holeAI(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_concentrated_ball::npc_concentrated_ballAI::npc_concentrated_ballAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_frost_tomb::npc_frost_tomb(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_hol_monument::npc_hol_monumentAI::npc_hol_monumentAI(), npc_power_spark::npc_power_sparkAI::npc_power_sparkAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::npc_ulduar_iron_constructAI(), npc_ulduar_toasty_fire::npc_ulduar_toasty_fireAI::npc_ulduar_toasty_fireAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), spell_shadowfang_keep_forsaken_skills_aura::OnApply(), spell_direbrew_disarm::OnApply(), spell_love_is_in_the_air_romantic_picnic::OnApply(), spell_halion_combustion_consumption_aura::OnApply(), spell_load_into_catapult_aura::OnApply(), spell_gen_damage_reduction_aura::OnApply(), spell_gruul_ground_slam_trigger::OnApply(), spell_hun_ascpect_of_the_viper::OnApply(), spell_hun_viper_attack_speed::OnApply(), spell_item_with_mount_speed::OnApply(), spell_blood_queen_vampiric_bite::OnCast(), npc_chesspiece::OnCharmed(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_item_linken_boomerang::OnEffectLaunchTargetDisarm(), spell_item_linken_boomerang::OnEffectLaunchTargetStun(), npc_essence_of_twin::OnGossipHello(), npc_alchemist_adrianna::OnGossipHello(), go_inconspicuous_mine_car::OnGossipHello(), go_manticron_cube::OnGossipHello(), go_seer_of_zebhalak::OnGossipHello(), go_jump_a_tron::OnGossipHello(), go_orb_of_domination::OnGossipHello(), go_scourge_enclosure::OnGossipHello(), go_strange_pool::OnGossipHello(), go_simon_cluster::OnGossipHello(), go_tablet_of_the_seven::OnGossipHello(), go_arcane_prison::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), npc_steward_of_time::OnGossipSelect(), npc_iruk::OnGossipSelect(), npc_zephyr::OnGossipSelect(), npc_taxi::OnGossipSelect(), npc_locksmith::OnGossipSelect(), npc_engineering_tele_trinket::OnGossipSelect(), npc_sayge::OnGossipSelect(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_lokhtos_darkbargainer::OnGossipSelect(), boss_gloomrel::OnGossipSelect(), npc_death_knight_initiate::OnGossipSelect(), npc_parqual_fintallas::OnGossipSelect(), npcs_riverbreeze_and_silversky::OnGossipSelect(), npc_braug_dimspirit::OnGossipSelect(), npc_avatar_of_freya::OnGossipSelect(), npc_adventurous_dwarf::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), npc_wormhole::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), go_amberpine_outhouse::OnGossipSelect(), go_fel_crystalforge::OnGossipSelect(), go_bashir_crystalforge::OnGossipSelect(), go_apexis_relic::OnGossipSelect(), Player::OnGossipSelect(), spell_summon_all_players_dummy::OnHit(), spell_apothecary_perfume_spill::OnPeriodic(), spell_apothecary_cologne_spill::OnPeriodic(), spell_muru_summon_blood_elves_periodic_aura::OnPeriodic(), spell_claw_rage_aura::OnPeriodic(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_anubisath_mortal_strike::OnPeriodic(), spell_the_lich_king_soul_reaper_aura::OnPeriodic(), spell_yogg_saron_brain_link_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_illidan_tear_of_azzinoth_summon_channel_aura::OnPeriodic(), spell_illidan_demon_transform1_aura::OnPeriodic(), spell_illidan_cage_trap_stun_aura::OnPeriodic(), spell_black_temple_dementia_aura::OnPeriodic(), spell_npc22275_crystal_prison_aura::OnPeriodic(), spell_item_eye_of_grillok_aura::OnPeriodic(), spell_kalecgos_curse_of_boundless_agony_aura::OnPeriodic(), spell_muru_darkness_aura::OnPeriodic(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_the_lich_king_vile_spirits_aura::OnPeriodic(), spell_web_wrap_damage::OnPeriodic(), spell_assembly_rune_of_summoning_aura::OnPeriodic(), spell_thorim_lightning_pillar_P2_aura::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), spell_karathress_power_of_tidalvess::OnPeriodic(), spell_karathress_power_of_caribdis::OnPeriodic(), spell_leotheras_demon_link::OnPeriodic(), spell_lurker_below_spout::OnPeriodic(), spell_gen_periodic_knock_away::OnPeriodic(), spell_gen_turkey_marker::OnPeriodic(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnPlayerInWaterStateUpdate(), BattlefieldWG::OnPlayerJoinWar(), lfg::LFGPlayerScript::OnPlayerMapChanged(), MidsummerPlayerScript::OnPlayerUpdateZone(), spell_gen_proc_on_victim::OnProc(), npc_steward_of_time::OnQuestAccept(), npc_mikhail::OnQuestAccept(), npc_rocknot::OnQuestReward(), npc_thrall_bfu::OnQuestReward(), spell_kalecgos_spectral_realm_aura::OnRemove(), spell_azgalor_doom_aura::OnRemove(), spell_boss_salramm_steal_flesh_aura::OnRemove(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_putricide_mutation_init_aura::OnRemove(), spell_the_lich_king_shadow_trap_visual_aura::OnRemove(), spell_the_lich_king_harvest_soul_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_ioc_repair_turret_aura::OnRemove(), spell_dragonblight_devour_ghoul_periodic::OnRemove(), spell_kaelthas_flame_strike::OnRemove(), spell_item_goblin_weather_machine_aura::OnRemove(), spell_q12937_relief_for_the_fallen::OnRemove(), spell_warl_curse_of_doom::OnRemove(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), spell_item_shadowmourne_soul_fragment::OnStackChange(), at_hor_battered_hilt_throw::OnTrigger(), at_frozen_throne_teleport::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_stormwright_shelf::OnTrigger(), npc_wintergarde_gryphon::PassengerBoarded(), npc_four_car_garage::npc_four_car_garageAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), spell_quest_test_flight_charging::PerformKick(), spell_send_mug_control_aura::PeriodicTick(), spell_barreled_control_aura::PeriodicTick(), spell_dreamwalker_summon_suppresser_aura::PeriodicTick(), spell_summon_ice_spear_delayer::PeriodicTick(), spell_summoning_rhyme_aura::PeriodicTick(), spell_halion_twilight_phasing::Phase(), BattlegroundAV::PopulateNode(), spell_azjol_nerub_carrion_beetels::PrepareAuraScript(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11653_youre_not_so_big_now::PrepareSpellScript(), spell_q13369_fate_up_against_your_will::PrepareSpellScript(), SmartScript::ProcessAction(), ProcessCastaction(), Player::ProcessDelayedOperations(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::ProcessEvent(), ProcessTerrainStatusUpdate(), ProcessUnlearnAction(), BattlefieldWG::PromotePlayer(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), spell_gen_defend::RefreshVisualShields(), Vehicle::RemovePassenger(), spell_igb_below_zero::RemovePassengers(), boss_keristrasza::RemovePrison(), Player::ReportedAfkBy(), GuardAI::Reset(), npc_demonic_vapor::Reset(), npc_demonic_vapor_trail::Reset(), npc_batrider::Reset(), npc_dark_iron_guzzler::Reset(), boss_headless_horseman_pumpkin::Reset(), npc_taretha::npc_tarethaAI::Reset(), npc_medivh_bm::Reset(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_nerubian_burrower::npc_nerubian_burrowerAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_elemental::boss_drakkari_elementalAI::Reset(), npc_dark_nucleus::npc_dark_nucleusAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_anomalus::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_bjarngrim::boss_bjarngrimAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_freya_lifebinder::boss_freya_lifebinderAI::Reset(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::Reset(), boss_freya_nature_bomb::boss_freya_nature_bombAI::Reset(), boss_thorim_lightning_orb::boss_thorim_lightning_orbAI::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::Reset(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_yoggsaron_voice::boss_yoggsaron_voiceAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_frozen_orb::npc_frozen_orbAI::Reset(), npc_frozen_orb_stalker::npc_frozen_orb_stalkerAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::Reset(), npc_ashtongue_channeler::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), boss_wrath_scryer_soccothrates::Reset(), npc_training_dummy::npc_training_dummyAI::Reset(), BfGraveyard::Resurrect(), Resurrect(), Player::ResurrectPlayer(), Player::RewardQuest(), boss_bjarngrim::boss_bjarngrimAI::RollStance(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), Map::ScriptsProcess(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_sayge::SendAction(), go_skull_pile::SendActionMenu(), npc_xt002_heart::npc_xt002_heartAI::SendEnergyToCorner(), Player::SendInitialPacketsAfterAddToMap(), Player::SendQuestUpdate(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), npc_eastvale_peasent::SetData(), SetModelVisible(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), npc_stable_master::npc_stable_masterAI::sGossipSelect(), npc_brewfest_keg_reciver::sGossipSelect(), npc_cairne_bloodhoof::npc_cairne_bloodhoofAI::sGossipSelect(), npc_chesspiece::sGossipSelect(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::sGossipSelect(), npc_zafod_boombox::npc_zafod_boomboxAI::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_cultist_engineer::sGossipSelect(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_skadi_grauf::boss_skadi_graufAI::SpawnFlameTriggers(), boss_malchezaar::SpawnInfernal(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), boss_eadric::boss_eadricAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_ichor_globule::npc_ichor_globuleAI::SpellHit(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_franklin::npc_franklinAI::SpellHit(), npc_necropolis_relay::SpellHit(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::SpellHit(), npc_dark_iron_guzzler::SpellHit(), boss_headless_horseman::SpellHit(), boss_thorim_pillar::boss_thorim_pillarAI::SpellHit(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::SpellHit(), npc_necropolis_proxy::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_living_constellation::npc_living_constellationAI::SpellHit(), boss_ignis::boss_ignisAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), npc_necrotic_shard::SpellHit(), npc_soh_fire_trigger::SpellHit(), boss_headless_horseman_head::SpellHit(), boss_magus_telestra::SpellHit(), boss_thorim::boss_thorimAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_bronjahm::boss_bronjahmAI::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_felmyst::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_rotface::boss_rotfaceAI::SpellHitTarget(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), boss_hodir::boss_hodirAI::SpellHitTarget(), npc_ulduar_rocket_strike_trigger::npc_ulduar_rocket_strike_triggerAI::SpellHitTarget(), npc_q24545_lich_king::npc_q24545_lich_kingAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), boss_epoch::boss_epochAI::SpellHitTarget(), boss_sapphiron::boss_sapphironAI::SpellHitTarget(), boss_skadi_grauf::boss_skadi_graufAI::SpellHitTarget(), boss_shirrak_the_dead_watcher::SpellHitTarget(), npc_pet_gen_soul_trader_beacon::SpellHitTarget(), Battleground::SpiritOfCompetitionEvent(), boss_ionar::boss_ionarAI::Split(), boss_heigan::boss_heiganAI::StartFightPhase(), npc_finklestein::npc_finklesteinAI::StartNextTask(), spell_dk_ghoul_explode::Suicide(), boss_anzu::SummonBroods(), boss_anubrekhan::boss_anubrekhanAI::SummonedCreatureDies(), boss_cthun::SummonedCreatureDies(), boss_vexallus::SummonedCreatureDies(), boss_paletress::boss_paletressAI::SummonMemory(), go_wind_stone::go_wind_stoneAI::SummonNPC(), spell_igb_check_for_players::TeleportPlayer(), BattlegroundSA::TeleportToEntrancePosition(), spell_midsummer_fling_torch::ThrowNextTorch(), TriggerBurningPitch(), npc_orb_carrier::npc_orb_carrierAI::TriggerCutter(), spell_koralon_meteor_fists_aura::TriggerFists(), spell_flame_warder_meteor_fists_aura::TriggerFists(), spell_gen_holiday_buff_food::TriggerFoodBuff(), spell_item_brewfest_hops::Update(), spell_karazhan_brittle_bones_aura::Update(), spell_black_temple_curse_of_the_bleakheart_aura::Update(), spell_illidari_council_deadly_strike_aura::Update(), spell_mother_shahraz_random_periodic_aura::Update(), spell_mother_shahraz_beam_periodic_aura::Update(), spell_mother_shahraz_saber_lash_aura::Update(), spell_black_temple_charge_rage_aura::Update(), Pet::Update(), GameObject::Update(), TotemAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_image_of_medivh::npc_image_of_medivhAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_demonic_vapor::UpdateAI(), npc_demonic_vapor_trail::UpdateAI(), npc_kalecgos_kj::UpdateAI(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_brewfest_super_brew_trigger::UpdateAI(), npc_hallows_end_train_fire::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_headless_horseman_head::UpdateAI(), boss_headless_horseman_pumpkin::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), npc_time_rift::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_tharnarian::npc_tharnarianAI::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), npc_halion_controller::npc_halion_controllerAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_swarm_scarab::npc_swarm_scarabAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_druid::npc_toc_druidAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_paladin::npc_toc_paladinAI::UpdateAI(), npc_toc_priest::npc_toc_priestAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), npc_pos_icicle_trigger::npc_pos_icicle_triggerAI::UpdateAI(), npc_pos_collapsing_icicle::npc_pos_collapsing_icicleAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::UpdateAI(), boss_heigan::boss_heiganAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), npc_alexstrasza::npc_alexstraszaAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), npc_crystal_spike::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir::boss_sjonnirAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_freya_nature_bomb::boss_freya_nature_bombAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_saronite_animus::npc_ulduar_saronite_animusAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_icicle::npc_ulduar_icicleAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), npc_ulduar_proximity_mine::npc_ulduar_proximity_mineAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_dalronn_the_controller::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_beryl_sorcerer::npc_beryl_sorcererAI::UpdateAI(), npc_thassarian::npc_thassarianAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_jungle_punch_target::npc_jungle_punch_targetAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_queue::npc_wg_queueAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_invis_infernal_caster::npc_invis_infernal_casterAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), trigger_periodic::trigger_periodicAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_maexxna_webwrap::boss_maexxna_webwrapAI::UpdateAI(), npc_living_poison::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_q24545_vegard_dummy::npc_q24545_vegard_dummyAI::UpdateAI(), Player::UpdateAreaDependentAuras(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdatePhase(), Player::UpdateZoneDependentAuras(), GameObject::Use(), Player::VehicleSpellInitialize(), boss_bjarngrim::boss_bjarngrimAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), and npc_engineer_helice::npc_engineer_heliceAI::WaypointReached().

◆ CastSpell() [4/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1240{
1241 return CastSpell(victim, spellInfo, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1242}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [5/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1245{
1246 SpellCastTargets targets;
1247 targets.SetUnitTarget(victim);
1248 return CastSpell(targets, spellInfo, nullptr, triggerFlags, castItem, triggeredByAura, originalCaster);
1249}

References CastSpell(), and SpellCastTargets::SetUnitTarget().

◆ CastSpell() [6/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1223{
1224 return CastSpell(victim, spellId, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1225}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [7/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1228{
1229 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1230 if (!spellInfo)
1231 {
1232 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1234 }
1235
1236 return CastSpell(victim, spellInfo, triggerFlags, castItem, triggeredByAura, originalCaster);
1237}

References CastSpell(), Object::GetGUID(), LOG_ERROR, SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastStop()

◆ ChangeSeat()

void Unit::ChangeSeat ( int8  seatId,
bool  next = true 
)
19547{
19548 if (!m_vehicle)
19549 return;
19550
19551 if (seatId < 0)
19552 {
19553 seatId = m_vehicle->GetNextEmptySeat(GetTransSeat(), next);
19554 if (seatId < 0)
19555 return;
19556 }
19557 else if (seatId == GetTransSeat() || !m_vehicle->HasEmptySeat(seatId))
19558 return;
19559
19561 if (!m_vehicle->AddPassenger(this, seatId))
19562 ABORT();
19563}
int8 GetNextEmptySeat(int8 seatId, bool next) const
Definition: Vehicle.cpp:246
bool HasEmptySeat(int8 seatId) const
Definition: Vehicle.cpp:220

References ABORT, Vehicle::AddPassenger(), Vehicle::GetNextEmptySeat(), WorldObject::GetTransSeat(), Vehicle::HasEmptySeat(), m_vehicle, and Vehicle::RemovePassenger().

Referenced by _EnterVehicle(), and WorldSession::HandleChangeSeatsOnControlledVehicle().

◆ CleanupBeforeRemoveFromMap()

void Unit::CleanupBeforeRemoveFromMap ( bool  finalCleanup)
15830{
15832 return;
15833
15834 // This needs to be before RemoveFromWorld to make GetCaster() return a valid pointer on aura removal
15836
15837 if (IsInWorld()) // not in world and not being removed atm
15839
15840 ASSERT(GetGUID());
15841
15842 // A unit may be in removelist and not in world, but it is still in grid
15843 // and may have some references during delete
15846
15847 if (finalCleanup)
15848 m_cleanupDone = true;
15849
15850 CombatStop();
15855 GetMotionMaster()->Clear(false); // remove different non-standard movement generators.
15856}
void deleteReferences(bool removeFromMap=false)
Definition: HostileRefMgr.cpp:125
void ClearAllThreat()
Definition: ThreatMgr.cpp:417
void CombatStop(bool includingCast=false)
Definition: Unit.cpp:10531
void RemoveAllGameObjects()
Definition: Unit.cpp:6359
void ClearComboPoints()
Definition: Unit.cpp:16947
void ClearComboPointHolders()
Definition: Unit.cpp:17002
HostileRefMgr & getHostileRefMgr()
Definition: Unit.h:904
void RemoveFromWorld() override
Definition: Unit.cpp:15783
void RemoveAllAuras()
Definition: Unit.cpp:5384
ThreatMgr & GetThreatMgr()
Definition: Unit.h:900
void Clear(bool reset=true)
Definition: MotionMaster.h:167

References ASSERT, MotionMaster::Clear(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearComboPoints(), CombatStop(), HostileRefMgr::deleteReferences(), Object::GetGUID(), getHostileRefMgr(), GetMotionMaster(), GetThreatMgr(), InterruptNonMeleeSpells(), IsDuringRemoveFromWorld(), Object::IsInWorld(), m_cleanupDone, RemoveAllAuras(), RemoveAllGameObjects(), and RemoveFromWorld().

Referenced by CleanupsBeforeDelete().

◆ CleanupsBeforeDelete()

void Unit::CleanupsBeforeDelete ( bool  finalCleanup = true)
overridevirtual

Reimplemented from WorldObject.

15859{
15860 if (GetTransport())
15861 {
15863 SetTransport(nullptr);
15866 }
15867
15868 CleanupBeforeRemoveFromMap(finalCleanup);
15869}
void RemoveMovementFlag(uint32 flag)
Definition: Object.h:345
void Reset()
Definition: Object.h:299
void SetTransport(Transport *t)
Definition: Object.h:691
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
void CleanupBeforeRemoveFromMap(bool finalCleanup)
Definition: Unit.cpp:15829

References CleanupBeforeRemoveFromMap(), WorldObject::GetTransport(), WorldObject::m_movementInfo, MOVEMENTFLAG_ONTRANSPORT, MovementInfo::RemoveMovementFlag(), Transport::RemovePassenger(), MovementInfo::TransportInfo::Reset(), WorldObject::SetTransport(), and MovementInfo::transport.

Referenced by Player::CleanupsBeforeDelete(), npc_commandscript::HandleNpcAddCommand(), and Map::RemoveAllObjectsInRemoveList().

◆ ClearAllReactives()

void Unit::ClearAllReactives ( )
17011{
17012 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
17013 m_reactiveTimer[i] = 0;
17014
17021}
@ CLASS_CONTEXT_ABILITY_REACTIVE
Definition: UnitDefines.h:237
@ CLASS_HUNTER
Definition: SharedDefines.h:143
@ CLASS_WARRIOR
Definition: SharedDefines.h:141
@ AURA_STATE_DEFENSE
Definition: SharedDefines.h:1303
@ AURA_STATE_HUNTER_PARRY
Definition: SharedDefines.h:1309
virtual bool IsClass(Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
Definition: Unit.h:796
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition: Unit.cpp:10642

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), Object::IsPlayer(), m_reactiveTimer, MAX_REACTIVE, and ModifyAuraState().

Referenced by Player::ActivateSpec(), and setDeathState().

◆ ClearComboPointHolders()

void Unit::ClearComboPointHolders ( )
17003{
17004 while (!m_ComboPointHolders.empty())
17005 {
17006 (*m_ComboPointHolders.begin())->ClearComboPoints(); // this also removes it from m_comboPointHolders
17007 }
17008}

References ClearComboPoints(), and m_ComboPointHolders.

Referenced by CreatureAI::_EnterEvadeMode(), CleanupBeforeRemoveFromMap(), Player::RemoveFromWorld(), and setDeathState().

◆ ClearComboPoints()

void Unit::ClearComboPoints ( )
16948{
16949 if (!m_comboTarget)
16950 {
16951 return;
16952 }
16953
16954 // remove Premed-like effects
16955 // (NB: this Aura retains the CP while it's active - now that CP have reset, it shouldn't be there anymore)
16957
16958 m_comboPoints = 0;
16961 m_comboTarget = nullptr;
16962}
@ SPELL_AURA_RETAIN_COMBO_POINTS
Definition: SpellAuraDefines.h:211

References m_comboPoints, m_comboTarget, RemoveAurasByType(), RemoveComboPointHolder(), SendComboPoints(), and SPELL_AURA_RETAIN_COMBO_POINTS.

Referenced by Spell::_handle_finish_phase(), CleanupBeforeRemoveFromMap(), ClearAllReactives(), ClearComboPointHolders(), Player::DuelComplete(), Player::RemoveFromWorld(), Player::setDeathState(), and UpdateReactives().

◆ ClearDiminishings()

void Unit::ClearDiminishings ( )
inline
1779{ m_Diminishing.clear(); }

References m_Diminishing.

Referenced by setDeathState().

◆ ClearEmoteState()

void Unit::ClearEmoteState ( )
inline

Sets emote state (looping emote). Emotes available in SharedDefines.h.

void SetEmoteState(Emote emoteState)
Definition: Unit.h:713

References EMOTE_ONESHOT_NONE, and SetEmoteState().

Referenced by boss_felblood_kaelthas::DoAction().

◆ ClearInCombat()

void Unit::ClearInCombat ( )
13911{
13912 m_CombatTimer = 0;
13914
13915 // Player's state will be cleared in Player::UpdateContestedPvP
13916 if (Creature* creature = ToCreature())
13917 {
13918 if (creature->GetCreatureTemplate() && creature->GetCreatureTemplate()->unit_flags & UNIT_FLAG_IMMUNE_TO_PC)
13919 SetImmuneToPC(true); // set immunity state to the one from db on evade
13920
13923 ReplaceAllDynamicFlags(creature->GetCreatureTemplate()->dynamicflags);
13924
13925 creature->SetAssistanceTimer(0);
13926
13927 // Xinef: will be recalculated at follow movement generator initialization
13928 if (!IsPet() && !IsCharmed())
13929 return;
13930 }
13931 else if (Player* player = ToPlayer())
13932 {
13933 player->UpdatePotionCooldown();
13934 if (player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
13935 for (uint8 i = 0; i < MAX_RUNES; ++i)
13936 player->SetGracePeriod(i, 0);
13937 }
13938
13939 if (Player* player = this->ToPlayer())
13940 {
13941 sScriptMgr->OnPlayerLeaveCombat(player);
13942 }
13943}
@ CLASS_CONTEXT_ABILITY
Definition: UnitDefines.h:236
@ UNIT_STATE_ATTACK_PLAYER
Definition: UnitDefines.h:184
@ UNIT_FLAG_IN_COMBAT
Definition: UnitDefines.h:271
@ UNIT_FLAG_IMMUNE_TO_PC
Definition: UnitDefines.h:260
#define MAX_RUNES
Definition: Player.h:393
@ CLASS_DEATH_KNIGHT
Definition: SharedDefines.h:146
void ReplaceAllDynamicFlags(uint32 flag) override
Definition: Unit.h:724
bool IsCharmed() const
Definition: Unit.h:1239
bool IsPet() const
Definition: Unit.h:749
void SetImmuneToPC(bool apply, bool keepCombat=false)
Definition: Unit.cpp:13702
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition: Unit.h:704

References CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, ClearUnitState(), Object::HasDynamicFlag(), IsCharmed(), IsPet(), m_CombatTimer, MAX_RUNES, RemoveUnitFlag(), ReplaceAllDynamicFlags(), SetImmuneToPC(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_DYNFLAG_TAPPED, UNIT_FLAG_IMMUNE_TO_PC, UNIT_FLAG_IN_COMBAT, and UNIT_STATE_ATTACK_PLAYER.

Referenced by CombatStop(), Player::LoadFromDB(), and Update().

◆ ClearInPetCombat()

◆ ClearUnitState()

void Unit::ClearUnitState ( uint32  f)
inline
692{ m_state &= ~f; }

References m_state.

Referenced by Spell::_cast(), HomeMovementGenerator< Creature >::_setTargetLocation(), Attack(), FollowerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), AttackStop(), ClearInCombat(), boss_thorim::boss_thorimAI::DisableThorim(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), HomeMovementGenerator< Creature >::DoFinalize(), WaypointMovementGenerator< Creature >::DoFinalize(), RandomMovementGenerator< T >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), RandomMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), Spell::EffectResurrectPet(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_ayamiss::EnterEvadeMode(), SmartAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), TimedFleeingMovementGenerator::Finalize(), RotateMovementGenerator::Finalize(), DistractMovementGenerator::Finalize(), AssistanceDistractMovementGenerator::Finalize(), Spell::finish(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), SmartAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), MotionMaster::MoveTargetedHome(), WaypointMovementGenerator< Creature >::OnArrived(), boss_nightbane::PathEndReached(), Creature::ReleaseFocus(), RemoveCharmedBy(), MotionTransport::RemovePassenger(), boss_ayamiss::Reset(), boss_hungarfen::Reset(), Player::ResetContestedPvP(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SetClientControl(), SmartAI::SetCombatMovement(), SetControlled(), Creature::setDeathState(), Player::setDeathState(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Player::SetIsSpectator(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), StopMoving(), StopMovingOnCurrentPos(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), and boss_the_lich_king::boss_the_lich_kingAI::UpdateAI().

◆ CombatStart()

void Unit::CombatStart ( Unit target,
bool  initialAggro = true 
)
13721{
13722 // Xinef: Dont allow to start combat with triggers
13723 if (victim->IsCreature() && victim->ToCreature()->IsTrigger())
13724 return;
13725
13726 if (initialAggro)
13727 {
13728 // Make player victim stand up automatically
13729 if (victim->getStandState() && victim->IsPlayer())
13730 {
13731 victim->SetStandState(UNIT_STAND_STATE_STAND);
13732 }
13733
13734 if (!victim->IsInCombat() && !victim->IsPlayer() && !victim->ToCreature()->HasReactState(REACT_PASSIVE) && victim->ToCreature()->IsAIEnabled)
13735 {
13736 if (victim->IsPet())
13737 victim->ToCreature()->AI()->AttackedBy(this); // PetAI has special handler before AttackStart()
13738 else
13739 {
13740 victim->ToCreature()->AI()->AttackStart(this);
13741 // if the target is an NPC with a pet or minion, pet should react.
13742 if (Unit* victimControlledUnit = victim->GetFirstControlled())
13743 {
13744 victimControlledUnit->SetInCombatWith(this);
13745 SetInCombatWith(victimControlledUnit);
13746 victimControlledUnit->AddThreat(this, 0.0f);
13747 }
13748 }
13749
13750 // if unit has an owner, put owner in combat.
13751 if (Unit* victimOwner = victim->GetOwner())
13752 {
13753 if (!(victimOwner->IsInCombatWith(this)))
13754 {
13755 /* warding off to not take over aggro for no reason
13756 Using only AddThreat causes delay in attack */
13757 if (!victimOwner->IsInCombat() && victimOwner->IsAIEnabled)
13758 {
13759 victimOwner->ToCreature()->AI()->AttackStart(this);
13760 }
13761 victimOwner->SetInCombatWith(this);
13762 SetInCombatWith(victimOwner);
13763 victimOwner->AddThreat(this, 0.0f);
13764 }
13765 }
13766 }
13767
13768 bool alreadyInCombat = IsInCombat();
13769
13770 SetInCombatWith(victim);
13771 victim->SetInCombatWith(this);
13772
13773 // Update leash timer when attacking creatures
13774 if (victim->IsCreature() && this != victim)
13775 victim->ToCreature()->UpdateLeashExtensionTime();
13776
13777 // Xinef: If pet started combat - put owner in combat
13778 if (!alreadyInCombat && IsInCombat())
13779 {
13780 if (Unit* owner = GetOwner())
13781 {
13782 owner->SetInCombatWith(victim);
13783 victim->SetInCombatWith(owner);
13784 }
13785 }
13786 }
13787
13788 Unit* who = victim->GetCharmerOrOwnerOrSelf();
13789 if (who->IsPlayer())
13790 SetContestedPvP(who->ToPlayer());
13791
13793 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13794 {
13795 player->UpdatePvP(true);
13797 }
13798}
@ AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT
Definition: SpellDefines.h:66
@ UNIT_STAND_STATE_STAND
Definition: UnitDefines.h:32
@ REACT_PASSIVE
Definition: Unit.h:549
void UpdatePvP(bool state, bool _override=false)
Definition: PlayerUpdates.cpp:1526
Unit * GetCharmerOrOwnerOrSelf() const
Definition: Unit.h:1216
void SetContestedPvP(Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
Definition: Unit.cpp:17331
Unit * GetFirstControlled() const
Definition: Unit.cpp:11170
bool IsInCombat() const
Definition: Unit.h:881

References Creature::AI(), CreatureAI::AttackedBy(), UnitAI::AttackStart(), AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetFirstControlled(), GetOwner(), getStandState(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), IsInCombat(), IsPet(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), REACT_PASSIVE, RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), SetStandState(), Object::ToCreature(), Object::ToPlayer(), UNIT_STAND_STATE_STAND, Creature::UpdateLeashExtensionTime(), and Player::UpdatePvP().

Referenced by AttackerStateUpdate(), Spell::CheckCast(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectTaunt(), and AssistDelayEvent::Execute().

◆ CombatStartOnCast()

void Unit::CombatStartOnCast ( Unit target,
bool  initialAggro = true,
uint32  duration = 0 
)
13801{
13802 // Xinef: Dont allow to start combat with triggers
13803 if (target->IsCreature() && target->ToCreature()->IsTrigger())
13804 return;
13805
13806 if (initialAggro)
13807 {
13808 SetInCombatWith(target, duration);
13809
13810 // Xinef: If pet started combat - put owner in combat
13811 if (Unit* owner = GetOwner())
13812 owner->SetInCombatWith(target, duration);
13813
13814 // Update leash timer when attacking creatures
13815 if (target->IsCreature())
13817 else if (ToCreature()) // Reset leash if it is a spell caster, else it may evade inbetween casts
13819 }
13820
13821 Unit* who = target->GetCharmerOrOwnerOrSelf();
13822 if (who->IsPlayer())
13823 SetContestedPvP(who->ToPlayer());
13824
13826 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13827 {
13828 player->UpdatePvP(true);
13830 }
13831}
bool IsTrigger() const
Definition: Creature.h:76

References AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetOwner(), Object::IsCreature(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), Object::ToCreature(), Object::ToPlayer(), Creature::UpdateLeashExtensionTime(), and Player::UpdatePvP().

Referenced by Spell::_cast().

◆ CombatStop()

void Unit::CombatStop ( bool  includingCast = false)
10532{
10533 if (includingCast && IsNonMeleeSpellCast(false))
10535
10536 AttackStop();
10538 if (IsPlayer())
10539 ToPlayer()->SendAttackSwingCancelAttack(); // melee and ranged forced attack cancel
10540 if (Creature* pCreature = ToCreature())
10541 pCreature->ClearLastLeashExtensionTimePtr();
10542 ClearInCombat();
10543
10544 // xinef: just in case
10545 if (IsPetInCombat() && !IsPlayer())
10547}
void SendAttackSwingCancelAttack()
Definition: PlayerMisc.cpp:140
bool IsPetInCombat() const
Definition: Unit.h:884
void ClearInPetCombat()
Definition: Unit.cpp:13945
void RemoveAllAttackers()
Remove all units in m_attackers list and send them AttackStop()
Definition: Unit.cpp:10579
void ClearInCombat()
Definition: Unit.cpp:13910
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition: Unit.cpp:10498

References AttackStop(), ClearInCombat(), ClearInPetCombat(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), IsPetInCombat(), Object::IsPlayer(), RemoveAllAttackers(), Player::SendAttackSwingCancelAttack(), Object::ToCreature(), and Object::ToPlayer().

Referenced by CreatureAI::_EnterEvadeMode(), PetAI::_stopAttack(), Player::ActivateTaxiPathTo(), CleanupBeforeRemoveFromMap(), CombatStopWithPets(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_kalecgos::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_maiev_illidan::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSanctuary(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), TotemAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), npc_pet_dk_ebon_gargoyle::FlyAway(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleCombatStopCommand(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), spell_chapter2_persuasive_strike::HandleHit(), npc_commandscript::HandleNpcDeleteCommand(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), SmartScript::ProcessAction(), Player::RemovePet(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), setDeathState(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), Player::TeleportTo(), Totem::UnSummon(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ CombatStopWithPets()

void Unit::CombatStopWithPets ( bool  includingCast = false)
10550{
10551 CombatStop(includingCast);
10552
10553 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10554 (*itr)->CombatStop(includingCast);
10555}

References CombatStop(), and m_Controlled.

Referenced by DealDamage(), WorldSession::HandleDuelCancelledOpcode(), Player::SetGameMaster(), Player::SetGMVisible(), and Player::UpdateArea().

◆ CountPctFromCurHealth()

uint32 Unit::CountPctFromCurHealth ( int32  pct) const
inline
1047{ return CalculatePct(GetHealth(), pct); }
uint32 GetHealth() const
Definition: Unit.h:1033

References CalculatePct(), and GetHealth().

Referenced by spell_gen_leeching_swarm_aura::HandleEffectPeriodic().

◆ CountPctFromMaxHealth()

uint32 Unit::CountPctFromMaxHealth ( int32  pct) const
inline
1046{ return CalculatePct(GetMaxHealth(), pct); }
uint32 GetMaxHealth() const
Definition: Unit.h:1034

References CalculatePct(), and GetMaxHealth().

Referenced by spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_dk_anti_magic_shell_self::CalculateAmount(), spell_dk_vampiric_blood::CalculateAmount(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::EffectHeal(), Spell::EffectHealPct(), Spell::EffectResurrect(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonType(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), spell_dk_death_strike::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_warr_last_stand::HandleDummy(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), boss_harbinger_skyriss::JustSummoned(), boss_hadronox::boss_hadronoxAI::KilledUnit(), Pet::LoadPetFromDB(), boss_vaelastrasz::boss_vaelAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), and npc_injured_patient::npc_injured_patientAI::UpdateAI().

◆ CreateTamedPetFrom() [1/2]

Pet * Unit::CreateTamedPetFrom ( Creature creatureTarget,
uint32  spell_id = 0 
)
17435{
17436 if (!IsPlayer())
17437 return nullptr;
17438
17439 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17440
17441 if (!pet->CreateBaseAtCreature(creatureTarget))
17442 {
17443 delete pet;
17444 return nullptr;
17445 }
17446
17447 uint8 level = creatureTarget->GetLevel() + 5 < GetLevel() ? (GetLevel() - 5) : creatureTarget->GetLevel();
17448
17449 if (!InitTamedPet(pet, level, spell_id))
17450 {
17451 delete pet;
17452 return nullptr;
17453 }
17454
17455 return pet;
17456}
@ HUNTER_PET
Definition: PetDefines.h:32
bool CreateBaseAtCreature(Creature *creature)
Definition: Pet.cpp:941
bool InitTamedPet(Pet *pet, uint8 level, uint32 spell_id)
Definition: Unit.cpp:17478

References Pet::CreateBaseAtCreature(), GetLevel(), HUNTER_PET, InitTamedPet(), Object::IsPlayer(), and Object::ToPlayer().

Referenced by Player::CreatePet(), Spell::EffectCreateTamedPet(), and Spell::EffectTameCreature().

◆ CreateTamedPetFrom() [2/2]

Pet * Unit::CreateTamedPetFrom ( uint32  creatureEntry,
uint32  spell_id = 0 
)
17459{
17460 if (!IsPlayer())
17461 return nullptr;
17462
17463 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creatureEntry);
17464 if (!creatureInfo)
17465 return nullptr;
17466
17467 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17468
17469 if (!pet->CreateBaseAtCreatureInfo(creatureInfo, this) || !InitTamedPet(pet, GetLevel(), spell_id))
17470 {
17471 delete pet;
17472 return nullptr;
17473 }
17474
17475 return pet;
17476}
#define sObjectMgr
Definition: ObjectMgr.h:1650
Definition: CreatureData.h:186
bool CreateBaseAtCreatureInfo(CreatureTemplate const *cinfo, Unit *owner)
Definition: Pet.cpp:976

References Pet::CreateBaseAtCreatureInfo(), GetLevel(), HUNTER_PET, InitTamedPet(), Object::IsPlayer(), sObjectMgr, and Object::ToPlayer().

◆ CreateVehicleKit()

bool Unit::CreateVehicleKit ( uint32  id,
uint32  creatureEntry 
)

Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)

18813{
18814 VehicleEntry const* vehInfo = sVehicleStore.LookupEntry(id);
18815 if (!vehInfo)
18816 return false;
18817
18818 m_vehicleKit = new Vehicle(this, vehInfo, creatureEntry);
18821 return true;
18822}
@ UPDATEFLAG_VEHICLE
Definition: UpdateData.h:46
@ UNIT_MASK_VEHICLE
Definition: UnitDefines.h:161
DBCStorage< VehicleEntry > sVehicleStore(VehicleEntryfmt)

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, sVehicleStore, UNIT_MASK_VEHICLE, and UPDATEFLAG_VEHICLE.

Referenced by Creature::CreateFromProto(), AuraEffect::HandleAuraSetVehicle(), Mount(), and npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit().

◆ DealDamage()

uint32 Unit::DealDamage ( Unit attacker,
Unit victim,
uint32  damage,
CleanDamage const *  cleanDamage = nullptr,
DamageEffectType  damagetype = DIRECT_DAMAGE,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  spellProto = nullptr,
bool  durabilityLoss = true,
bool  allowGM = false,
Spell const *  spell = nullptr 
)
static

@fix: Hack to avoid premature leashing

826{
827 damage = sScriptMgr->DealDamage(attacker, victim, damage, damagetype);
828 // Xinef: initialize damage done for rage calculations
829 // Xinef: its rare to modify damage in hooks, however training dummy's sets damage to 0
830 uint32 rage_damage = damage + ((cleanDamage != nullptr) ? cleanDamage->absorbed_damage : 0);
831
832 //if (attacker)
833 {
834 if (victim->IsAIEnabled)
835 victim->GetAI()->DamageTaken(attacker, damage, damagetype, damageSchoolMask);
836
837 if (attacker && attacker->IsAIEnabled)
838 attacker->GetAI()->DamageDealt(victim, damage, damagetype, damageSchoolMask);
839 }
840
841 // Hook for OnDamage Event
842 sScriptMgr->OnDamage(attacker, victim, damage);
843
844 if (victim->IsPlayer() && attacker != victim)
845 {
846 // Signal to pets that their owner was attacked
847 Pet* pet = victim->ToPlayer()->GetPet();
848
849 if (pet && pet->IsAlive())
850 pet->AI()->OwnerAttackedBy(attacker);
851 }
852
853 //Dont deal damage to unit if .cheat god is enable.
854 if (victim->IsPlayer())
855 {
856 if (victim->ToPlayer()->GetCommandStatus(CHEAT_GOD))
857 {
858 return 0;
859 }
860 }
861
862 // Signal the pet it was attacked so the AI can respond if needed
863 if (victim->IsCreature() && attacker != victim && victim->IsPet() && victim->IsAlive())
864 victim->ToPet()->AI()->AttackedBy(attacker);
865
866 if (damagetype != NODAMAGE)
867 {
868 // interrupting auras with AURA_INTERRUPT_FLAG_DAMAGE before checking !damage (absorbed damage breaks that type of auras)
869 if (spellProto)
870 {
871 if (!spellProto->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
873 }
874 else
876
877 // interrupt spells with SPELL_INTERRUPT_FLAG_ABORT_ON_DMG on absorbed damage (no dots)
878 if (!damage && damagetype != DOT && cleanDamage && cleanDamage->absorbed_damage)
879 {
880 if (victim != attacker && victim->IsPlayer())
881 {
882 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
883 {
884 if (spell->getState() == SPELL_STATE_PREPARING)
885 {
886 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
887 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
888 {
889 victim->InterruptNonMeleeSpells(false);
890 }
891 }
892 }
893 }
894 }
895
896 // We're going to call functions which can modify content of the list during iteration over it's elements
897 // Let's copy the list so we can prevent iterator invalidation
899 // copy damage to casters of this aura
900 for (AuraEffectList::iterator i = vCopyDamageCopy.begin(); i != vCopyDamageCopy.end(); ++i)
901 {
902 // Check if aura was removed during iteration - we don't need to work on such auras
903 if (!((*i)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
904 continue;
905 // check damage school mask
906 if (((*i)->GetMiscValue() & damageSchoolMask) == 0)
907 continue;
908
909 Unit* shareDamageTarget = (*i)->GetCaster();
910 if (!shareDamageTarget)
911 continue;
912 SpellInfo const* spell = (*i)->GetSpellInfo();
913
914 uint32 shareDamage = CalculatePct(damage, (*i)->GetAmount());
915
916 uint32 shareAbsorb = 0;
917 uint32 shareResist = 0;
918
919 if (shareDamageTarget->IsImmunedToDamageOrSchool(damageSchoolMask))
920 {
921 shareAbsorb = shareDamage;
922 shareDamage = 0;
923 }
924 else
925 {
926 DamageInfo sharedDamageInfo(attacker, shareDamageTarget, shareDamage, spellProto, damageSchoolMask, damagetype);
927 Unit::CalcAbsorbResist(sharedDamageInfo, true);
928 shareAbsorb = sharedDamageInfo.GetAbsorb();
929 shareResist = sharedDamageInfo.GetResist();
930 shareDamage = sharedDamageInfo.GetDamage();
931 Unit::DealDamageMods(shareDamageTarget, shareDamage, &shareAbsorb);
932 }
933
934 if (attacker && shareDamageTarget->IsPlayer())
935 {
936 attacker->SendSpellNonMeleeDamageLog(shareDamageTarget, spell, shareDamage, damageSchoolMask, shareAbsorb, shareResist, damagetype == DIRECT_DAMAGE, 0, false, true);
937 }
938
939 Unit::DealDamage(attacker, shareDamageTarget, shareDamage, cleanDamage, NODAMAGE, damageSchoolMask, spellProto, false, false, damageSpell);
940 }
941 }
942
943 // Rage from Damage made (only from direct weapon damage)
944 if (attacker && cleanDamage && damagetype == DIRECT_DAMAGE && attacker != victim && attacker->HasActivePowerType(POWER_RAGE))
945 {
946 uint32 weaponSpeedHitFactor;
947
948 switch (cleanDamage->attackType)
949 {
950 case BASE_ATTACK:
951 case OFF_ATTACK:
952 {
953 weaponSpeedHitFactor = uint32(attacker->GetAttackTime(cleanDamage->attackType) / 1000.0f * (cleanDamage->attackType == BASE_ATTACK ? 3.5f : 1.75f));
954 if (cleanDamage->hitOutCome == MELEE_HIT_CRIT)
955 weaponSpeedHitFactor *= 2;
956
957 attacker->RewardRage(rage_damage, weaponSpeedHitFactor, true);
958 break;
959 }
960 case RANGED_ATTACK:
961 break;
962 default:
963 break;
964 }
965 }
966
967 if (!damage)
968 {
969 // Rage from absorbed damage
970 if (cleanDamage && cleanDamage->absorbed_damage)
971 {
972 if (victim->HasActivePowerType(POWER_RAGE))
973 victim->RewardRage(cleanDamage->absorbed_damage, 0, false);
974
975 if (attacker && attacker->HasActivePowerType(POWER_RAGE))
976 attacker->RewardRage(cleanDamage->absorbed_damage, 0, true);
977 }
978
979 return 0;
980 }
981
982 LOG_DEBUG("entities.unit", "DealDamageStart");
983
984 uint32 health = victim->GetHealth();
985 LOG_DEBUG("entities.unit", "deal dmg:{} to health:{} ", damage, health);
986
987 // duel ends when player has 1 or less hp
988 bool duel_hasEnded = false;
989 bool duel_wasMounted = false;
990 if (victim->IsPlayer() && victim->ToPlayer()->duel && damage >= (health - 1))
991 {
992 // xinef: situation not possible earlier, just return silently.
993 if (!attacker)
994 return 0;
995
996 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
997 if (victim->ToPlayer()->duel->Opponent == attacker || victim->ToPlayer()->duel->Opponent->GetGUID() == attacker->GetOwnerGUID())
998 damage = health - 1;
999
1000 duel_hasEnded = true;
1001 }
1002 else if (victim->IsVehicle() && damage >= (health - 1) && victim->GetCharmer() && victim->GetCharmer()->IsPlayer())
1003 {
1004 Player* victimRider = victim->GetCharmer()->ToPlayer();
1005
1006 if (victimRider && victimRider->duel && victimRider->duel->IsMounted)
1007 {
1008 // xinef: situation not possible earlier, just return silently.
1009 if (!attacker)
1010 return 0;
1011
1012 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
1013 if (victimRider->duel->Opponent == attacker || victimRider->duel->Opponent->GetGUID() == attacker->GetCharmerGUID())
1014 damage = health - 1;
1015
1016 duel_wasMounted = true;
1017 duel_hasEnded = true;
1018 }
1019 }
1020
1021 if (attacker && attacker != victim)
1022 if (Player* killer = attacker->GetCharmerOrOwnerPlayerOrPlayerItself())
1023 {
1024 // pussywizard: don't allow GMs to deal damage in normal way (this leaves no evidence in logs!), they have commands to do so
1025 //if (!allowGM && killer->GetSession()->GetSecurity() && killer->GetSession()->GetSecurity() <= SEC_ADMINISTRATOR)
1026 // return 0;
1027
1028 if (Battleground* bg = killer->GetBattleground())
1029 {
1030 bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage);
1031 killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, damage, 0, victim); // pussywizard: InBattleground() optimization
1032 }
1033 //killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT, damage); // pussywizard: optimization
1034 }
1035
1036 if (victim->IsPlayer())
1037 ;//victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage); // pussywizard: optimization
1038 else if (!victim->IsControlledByPlayer() || victim->IsVehicle())
1039 {
1040 if (!victim->ToCreature()->hasLootRecipient())
1041 victim->ToCreature()->SetLootRecipient(attacker);
1042
1043 if (!attacker || attacker->IsControlledByPlayer() || attacker->IsCreatedByPlayer())
1044 {
1045 uint32 unDamage = health < damage ? health : damage;
1046 bool damagedByPlayer = unDamage && attacker && (attacker->IsPlayer() || attacker->m_movedByPlayer != nullptr);
1047 victim->ToCreature()->LowerPlayerDamageReq(unDamage, damagedByPlayer);
1048 }
1049 }
1050
1051 // Sparring
1052 if (victim->CanSparringWith(attacker))
1053 {
1054 if (damage >= victim->GetHealth())
1055 damage = 0;
1056
1057 uint32 sparringHealth = victim->GetHealth() * (victim->ToCreature()->GetSparringPct() / 100);
1058 if (victim->GetHealth() - damage <= sparringHealth)
1059 damage = 0;
1060 }
1061
1062 if (health <= damage)
1063 {
1064 LOG_DEBUG("entities.unit", "DealDamage: victim just died");
1065
1066 //if (attacker && victim->IsPlayer() && victim != attacker)
1067 //victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health); // pussywizard: optimization
1068 Unit::Kill(attacker, victim, durabilityLoss, cleanDamage ? cleanDamage->attackType : BASE_ATTACK, spellProto, damageSpell);
1069 }
1070 else
1071 {
1072 LOG_DEBUG("entities.unit", "DealDamageAlive");
1073
1074 //if (victim->IsPlayer())
1075 // victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, damage); // pussywizard: optimization
1076
1077 victim->ModifyHealth(- (int32)damage);
1078
1079 if (damagetype == DIRECT_DAMAGE || damagetype == SPELL_DIRECT_DAMAGE)
1080 victim->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, spellProto ? spellProto->Id : 0);
1081
1082 if (!victim->IsPlayer())
1083 {
1085 if (damagetype != DOT && damage > 0 && !victim->GetOwnerGUID().IsPlayer() && (!spellProto || !spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD)))
1087
1088 if (attacker)
1089 {
1090 if (spellProto && victim->CanHaveThreatList() && !victim->HasUnitState(UNIT_STATE_EVADE) && !victim->IsInCombatWith(attacker))
1091 {
1092 victim->CombatStart(attacker, !(spellProto->AttributesEx3 & SPELL_ATTR3_SUPPRESS_TARGET_PROCS));
1093 }
1094
1095 victim->AddThreat(attacker, float(damage), damageSchoolMask, spellProto);
1096 }
1097 }
1098 else // victim is a player
1099 {
1100 // random durability for items (HIT TAKEN)
1102 {
1105 }
1106 }
1107
1108 // Rage from damage received
1109 if (attacker != victim && victim->HasActivePowerType(POWER_RAGE))
1110 {
1111 uint32 rageDamage = damage + (cleanDamage ? cleanDamage->absorbed_damage : 0);
1112 victim->RewardRage(rageDamage, 0, false);
1113 }
1114
1115 if (attacker && attacker->IsPlayer())
1116 {
1117 // random durability for items (HIT DONE)
1119 {
1121 attacker->ToPlayer()->DurabilityPointLossForEquipSlot(slot);
1122 }
1123 }
1124
1125 if (damagetype != NODAMAGE && damage && (!spellProto || !(spellProto->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC) || spellProto->HasAttribute(SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK))))
1126 {
1127 if (victim != attacker && victim->IsPlayer()) // does not support creature push_back
1128 {
1129 if (damagetype != DOT && !(damageSpell && damageSpell->m_targets.HasDstChannel()))
1130 {
1131 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
1132 {
1133 if (spell->getState() == SPELL_STATE_PREPARING)
1134 {
1135 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
1136 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
1137 {
1138 victim->InterruptNonMeleeSpells(false);
1139 }
1140 else if (interruptFlags & SPELL_INTERRUPT_FLAG_PUSH_BACK)
1141 {
1142 spell->Delayed();
1143 }
1144 }
1145 }
1146
1147 if (Spell* spell = victim->m_currentSpells[CURRENT_CHANNELED_SPELL])
1148 if (spell->getState() == SPELL_STATE_CASTING)
1149 {
1150 if ((spell->m_spellInfo->ChannelInterruptFlags & CHANNEL_FLAG_DELAY) != 0)
1151 {
1152 spell->DelayedChannel();
1153 }
1154 }
1155 }
1156 }
1157 }
1158
1159 // last damage from duel opponent
1160 if (duel_hasEnded)
1161 {
1162 Player* he = duel_wasMounted ? victim->GetCharmer()->ToPlayer() : victim->ToPlayer();
1163
1164 ASSERT_NODEBUGINFO(he && he->duel);
1165
1166 if (duel_wasMounted) // In this case victim==mount
1167 victim->SetHealth(1);
1168 else
1169 he->SetHealth(1);
1170
1171 he->duel->Opponent->CombatStopWithPets(true);
1172 he->CombatStopWithPets(true);
1173
1174 he->CastSpell(he, 7267, true); // beg
1176 }
1177 }
1178
1179 LOG_DEBUG("entities.unit", "DealDamageEnd returned {} damage", damage);
1180
1181 return damage;
1182}
@ SPELL_AURA_DAMAGE_SHIELD
Definition: SpellAuraDefines.h:78
@ SPELL_AURA_SHARE_DAMAGE_PCT
Definition: SpellAuraDefines.h:363
@ CHANNEL_FLAG_DELAY
Definition: SpellDefines.h:38
@ AURA_INTERRUPT_FLAG_TAKE_DAMAGE
Definition: SpellDefines.h:44
@ AURA_INTERRUPT_FLAG_DIRECT_DAMAGE
Definition: SpellDefines.h:67
@ SPELL_INTERRUPT_FLAG_ABORT_ON_DMG
Definition: SpellDefines.h:30
@ SPELL_INTERRUPT_FLAG_PUSH_BACK
Definition: SpellDefines.h:27
@ SPELL_STATE_PREPARING
Definition: Spell.h:235
@ SPELL_STATE_CASTING
Definition: Spell.h:236
@ SCORE_DAMAGE_DONE
Definition: BattlegroundScore.h:32
@ NODAMAGE
Definition: Unit.h:253
@ CURRENT_CHANNELED_SPELL
Definition: Unit.h:540
@ CURRENT_GENERIC_SPELL
Definition: Unit.h:539
@ CHEAT_GOD
Definition: Player.h:995
EquipmentSlots
Definition: Player.h:669
@ EQUIPMENT_SLOT_END
Definition: Player.h:690
@ RATE_DURABILITY_LOSS_DAMAGE
Definition: WorldConfig.h:474
@ POWER_RAGE
Definition: SharedDefines.h:281
@ SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK
Definition: SharedDefines.h:658
@ SPELL_ATTR3_TREAT_AS_PERIODIC
Definition: SharedDefines.h:529
@ SPELL_ATTR3_SUPPRESS_TARGET_PROCS
Definition: SharedDefines.h:521
@ DUEL_WON
Definition: SharedDefines.h:3879
@ SPELL_ATTR4_REACTIVE_DAMAGE_PROC
Definition: SharedDefines.h:555
@ ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE
Definition: DBCEnums.h:130
#define ASSERT_NODEBUGINFO
Definition: Errors.h:69
bool roll_chance_f(float chance)
Definition: Random.h:57
virtual void DamageDealt(Unit *, uint32 &, DamageEffectType, SpellSchoolMask)
Called at any Damage to any victim (before damage apply)
Definition: UnitAI.h:361
virtual void DamageTaken(Unit *, uint32 &, DamageEffectType, SpellSchoolMask)
Called at any Damage from any attacker (before damage apply)
Definition: UnitAI.h:368
virtual void OwnerAttackedBy(Unit *)
Definition: CreatureAI.h:177
virtual void AttackedBy(Unit *)
Definition: CreatureAI.h:154
void SetLootRecipient(Unit *unit, bool withGroup=true)
Definition: Creature.cpp:1331
bool hasLootRecipient() const
Definition: Creature.h:235
float GetSparringPct() const
Definition: Creature.h:192
void LowerPlayerDamageReq(uint32 unDamage, bool damagedByPlayer=true)
Definition: Creature.cpp:3832
bool IsPlayer() const
Definition: ObjectGuid.h:168
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition: PlayerUpdates.cpp:2163
void DurabilityPointLossForEquipSlot(EquipmentSlots slot)
Definition: Player.cpp:4853
Pet * GetPet() const
Definition: Player.cpp:8994
bool GetCommandStatus(uint32 command) const
Definition: Player.h:1184
int32 ModifyHealth(int32 val)
Definition: Unit.cpp:14192
Pet * ToPet()
Definition: Unit.h:684
bool IsCreatedByPlayer() const
Definition: Unit.h:1237
Unit * GetCharmer() const
Definition: Unit.cpp:10703
static void Kill(Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
Definition: Unit.cpp:17799
void RewardRage(uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
Definition: Unit.cpp:19966
void SetHealth(uint32 val)
Definition: Unit.cpp:15579
ObjectGuid GetCharmerGUID() const
Definition: Unit.h:674
virtual bool HasActivePowerType(Powers power)
Definition: Unit.h:1057
void CombatStopWithPets(bool includingCast=false)
Definition: Unit.cpp:10549
uint32 ChannelInterruptFlags
Definition: SpellInfo.h:354
uint32 InterruptFlags
Definition: SpellInfo.h:352

References CleanDamage::absorbed_damage, ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, AddThreat(), Creature::AI(), ASSERT_NODEBUGINFO, CreatureAI::AttackedBy(), CleanDamage::attackType, SpellInfo::AttributesEx3, AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, AURA_INTERRUPT_FLAG_TAKE_DAMAGE, BASE_ATTACK, CalcAbsorbResist(), CalculatePct(), CanHaveThreatList(), CanSparringWith(), CastSpell(), CHANNEL_FLAG_DELAY, CHEAT_GOD, CombatStart(), CombatStopWithPets(), CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, UnitAI::DamageDealt(), UnitAI::DamageTaken(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, DOT, Player::duel, DUEL_WON, Player::DuelComplete(), Player::DurabilityPointLossForEquipSlot(), EQUIPMENT_SLOT_END, DamageInfo::GetAbsorb(), GetAI(), GetAttackTime(), GetAuraEffectsByType(), GetCharmer(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), Player::GetCommandStatus(), DamageInfo::GetDamage(), Object::GetGUID(), GetHealth(), GetOwnerGUID(), Player::GetPet(), DamageInfo::GetResist(), Creature::GetSparringPct(), HasActivePowerType(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellCastTargets::HasDstChannel(), Creature::hasLootRecipient(), HasUnitState(), CleanDamage::hitOutCome, SpellInfo::Id, InterruptNonMeleeSpells(), IsAIEnabled, IsAlive(), IsControlledByPlayer(), IsCreatedByPlayer(), Object::IsCreature(), IsImmunedToDamageOrSchool(), IsInCombatWith(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), IsVehicle(), Kill(), LOG_DEBUG, Creature::LowerPlayerDamageReq(), m_currentSpells, m_movedByPlayer, Spell::m_targets, MELEE_HIT_CRIT, ModifyHealth(), NODAMAGE, OFF_ATTACK, CreatureAI::OwnerAttackedBy(), POWER_RAGE, RANGED_ATTACK, RATE_DURABILITY_LOSS_DAMAGE, RemoveAurasWithInterruptFlags(), RewardRage(), roll_chance_f(), SCORE_DAMAGE_DONE, SendSpellNonMeleeDamageLog(), SetHealth(), Creature::SetLootRecipient(), SPELL_ATTR3_SUPPRESS_TARGET_PROCS, SPELL_ATTR3_TREAT_AS_PERIODIC, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK, SPELL_AURA_DAMAGE_SHIELD, SPELL_AURA_SHARE_DAMAGE_PCT, SPELL_DIRECT_DAMAGE, SPELL_INTERRUPT_FLAG_ABORT_ON_DMG, SPELL_INTERRUPT_FLAG_PUSH_BACK, SPELL_STATE_CASTING, SPELL_STATE_PREPARING, sScriptMgr, sWorld, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_STATE_EVADE, Player::UpdateAchievementCriteria(), Creature::UpdateLeashExtensionTime(), and urand().

Referenced by CalcAbsorbResist(), DealDamage(), DealMeleeDamage(), DealSpellDamage(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectInstaKill(), Player::EnvironmentalDamage(), spell_mt_phoenix_burn::HandleAfterCast(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), spell_svala_ritual_strike::HandleDummyEffect(), spell_valkyr_touch_aura::HandleEffectPeriodic(), spell_lady_vashj_magic_barrier::HandleEffectRemove(), spell_algalon_collapse_aura::HandlePeriodic(), spell_kaelthas_burn::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_gluth_decimate::HandleScriptEffect(), npc_necrotic_shard::SpellHit(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ DealDamageMods()

void Unit::DealDamageMods ( Unit const *  victim,
uint32 damage,
uint32 absorb 
)
static

◆ DealHeal()

int32 Unit::DealHeal ( Unit healer,
Unit victim,
uint32  addhealth 
)
static
11047{
11048 int32 gain = 0;
11049
11050 if (healer)
11051 {
11052 if (victim->IsAIEnabled)
11053 victim->GetAI()->HealReceived(healer, addhealth);
11054
11055 if (healer->IsAIEnabled)
11056 healer->GetAI()->HealDone(victim, addhealth);
11057 }
11058
11059 if (addhealth)
11060 gain = victim->ModifyHealth(int32(addhealth));
11061
11062 // Hook for OnHeal Event
11063 sScriptMgr->OnHeal(healer, victim, (uint32&)gain);
11064
11065 Unit* unit = healer;
11066
11067 if (healer && healer->IsCreature() && healer->ToCreature()->IsTotem())
11068 unit = healer->GetOwner();
11069
11070 if (!unit)
11071 return gain;
11072
11073 if (Player* player = unit->ToPlayer())
11074 {
11075 if (Battleground* bg = player->GetBattleground())
11076 bg->UpdatePlayerScore(player, SCORE_HEALING_DONE, gain);
11077
11078 // use the actual gain, as the overheal shall not be counted, skip gain 0 (it ignored anyway in to criteria)
11079 if (gain && player->InBattleground()) // pussywizard: InBattleground() optimization
11080 player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, gain, 0, victim);
11081
11082 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, addhealth); // pussywizard: optimization
11083 }
11084
11085 /*if (Player* player = victim->ToPlayer())
11086 {
11087 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain); // pussywizard: optimization
11088 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth); // pussywizard: optimization
11089 }*/
11090
11091 return gain;
11092}
@ SCORE_HEALING_DONE
Definition: BattlegroundScore.h:33
@ ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE
Definition: DBCEnums.h:169
virtual void HealReceived(Unit *, uint32 &)
Called when the creature receives heal.
Definition: UnitAI.h:371
virtual void HealDone(Unit *, uint32 &)
Called when the unit heals.
Definition: UnitAI.h:377

References ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, GetAI(), GetOwner(), UnitAI::HealDone(), UnitAI::HealReceived(), IsAIEnabled, Object::IsCreature(), IsTotem(), ModifyHealth(), SCORE_HEALING_DONE, sScriptMgr, Object::ToCreature(), and Object::ToPlayer().

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), HealBySpell(), and npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI().

◆ DealMeleeDamage()

void Unit::DealMeleeDamage ( CalcDamageInfo damageInfo,
bool  durabilityLoss 
)
Todo:
: Move this to a packet handler
1862{
1863 Unit* victim = damageInfo->target;
1864
1865 auto canTakeMeleeDamage = [&]()
1866 {
1867 return victim->IsAlive() && !victim->HasUnitState(UNIT_STATE_IN_FLIGHT) && (!victim->IsCreature() || !victim->ToCreature()->IsEvadingAttacks());
1868 };
1869
1870 if (!canTakeMeleeDamage())
1871 {
1872 return;
1873 }
1874
1875 // Hmmmm dont like this emotes client must by self do all animations
1876 if (damageInfo->HitInfo & HITINFO_CRITICALHIT)
1878 if (damageInfo->blocked_amount && damageInfo->TargetState != VICTIMSTATE_BLOCKS)
1880
1881 // Parry haste is enabled if it's not a creature or if the creature doesn't have the NO_PARRY_HASTEN flag.
1882 bool isParryHasteEnabled = !victim->IsCreature() ||
1884 if (damageInfo->TargetState == VICTIMSTATE_PARRY && isParryHasteEnabled)
1885 {
1886 // Get attack timers
1887 float offtime = float(victim->getAttackTimer(OFF_ATTACK));
1888 float basetime = float(victim->getAttackTimer(BASE_ATTACK));
1889 // Reduce attack time
1890 if (victim->HasOffhandWeaponForAttack() && offtime < basetime)
1891 {
1892 float percent20 = victim->GetAttackTime(OFF_ATTACK) * 0.20f;
1893 float percent60 = 3.0f * percent20;
1894 if (offtime > percent20 && offtime <= percent60)
1895 victim->setAttackTimer(OFF_ATTACK, uint32(percent20));
1896 else if (offtime > percent60)
1897 {
1898 offtime -= 2.0f * percent20;
1899 victim->setAttackTimer(OFF_ATTACK, uint32(offtime));
1900 }
1901 }
1902 else
1903 {
1904 float percent20 = victim->GetAttackTime(BASE_ATTACK) * 0.20f;
1905 float percent60 = 3.0f * percent20;
1906 if (basetime > percent20 && basetime <= percent60)
1907 victim->setAttackTimer(BASE_ATTACK, uint32(percent20));
1908 else if (basetime > percent60)
1909 {
1910 basetime -= 2.0f * percent20;
1911 victim->setAttackTimer(BASE_ATTACK, uint32(basetime));
1912 }
1913 }
1914 }
1915
1916 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1917 {
1918 if (!canTakeMeleeDamage() || (!damageInfo->damages[i].damage && !damageInfo->damages[i].absorb && !damageInfo->damages[i].resist))
1919 {
1920 continue;
1921 }
1922
1923 // Call default DealDamage
1924 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->damages[i].absorb, damageInfo->attackType, damageInfo->hitOutCome);
1925 Unit::DealDamage(this, victim, damageInfo->damages[i].damage, &cleanDamage, DIRECT_DAMAGE, SpellSchoolMask(damageInfo->damages[i].damageSchoolMask), nullptr, durabilityLoss);
1926 }
1927
1928 // gain rage if attack is fully blocked, dodged or parried
1930 {
1931 switch (damageInfo->attackType)
1932 {
1933 case BASE_ATTACK:
1934 case OFF_ATTACK:
1935 {
1936 uint32 weaponSpeedHitFactor = uint32(GetAttackTime(damageInfo->attackType) / 1000.0f * (damageInfo->attackType == BASE_ATTACK ? 3.5f : 1.75f));
1937 RewardRage(damageInfo->cleanDamage, weaponSpeedHitFactor, true);
1938 break;
1939 }
1940 default:
1941 break;
1942 }
1943 }
1944
1945 // If this is a creature and it attacks from behind it has a probability to daze it's victim
1946 if ((damageInfo->damages[0].damage + damageInfo->damages[1].damage) && ((damageInfo->hitOutCome == MELEE_HIT_CRIT || damageInfo->hitOutCome == MELEE_HIT_CRUSHING || damageInfo->hitOutCome == MELEE_HIT_NORMAL || damageInfo->hitOutCome == MELEE_HIT_GLANCING) &&
1947 !IsPlayer() && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this)
1948 && (victim->IsPlayer() || !victim->ToCreature()->isWorldBoss()) && !victim->IsVehicle()))
1949 {
1950 // -probability is between 0% and 40%
1951 // 20% base chance
1952 float Probability = 20.0f;
1953
1954 // there is a newbie protection, at level 10 just 7% base chance; assuming linear function
1955 if (victim->GetLevel() < 30)
1956 Probability = 0.65f * victim->GetLevel() + 0.5f;
1957
1958 uint32 VictimDefense = victim->GetDefenseSkillValue();
1959 uint32 AttackerMeleeSkill = GetUnitMeleeSkill();
1960
1961 // xinef: fix daze mechanics
1962 Probability -= ((float)VictimDefense - AttackerMeleeSkill) * 0.1428f;
1963
1964 if (Probability > 40.0f)
1965 Probability = 40.0f;
1966
1967 // Daze application
1968 if (sWorld->getBoolConfig(CONFIG_ENABLE_DAZE))
1969 if (roll_chance_f(std::max(0.0f, Probability)))
1970 CastSpell(victim, 1604, true);
1971 }
1972
1973 if (IsPlayer())
1974 ToPlayer()->CastItemCombatSpell(victim, damageInfo->attackType, damageInfo->procVictim, damageInfo->procEx);
1975
1976 // Do effect if any damage done to target
1977 if (damageInfo->damages[0].damage + damageInfo->damages[1].damage)
1978 {
1979 // We're going to call functions which can modify content of the list during iteration over it's elements
1980 // Let's copy the list so we can prevent iterator invalidation
1982 for (AuraEffectList::const_iterator dmgShieldItr = vDamageShieldsCopy.begin(); dmgShieldItr != vDamageShieldsCopy.end(); ++dmgShieldItr)
1983 {
1984 SpellInfo const* i_spellProto = (*dmgShieldItr)->GetSpellInfo();
1985 // Damage shield can be resisted...
1986 if (SpellMissInfo missInfo = victim->SpellHitResult(this, i_spellProto, false))
1987 {
1988 victim->SendSpellMiss(this, i_spellProto->Id, missInfo);
1989 continue;
1990 }
1991
1992 // ...or immuned
1993 if (IsImmunedToDamageOrSchool(i_spellProto))
1994 {
1995 victim->SendSpellDamageImmune(this, i_spellProto->Id);
1996 continue;
1997 }
1998
1999 uint32 damage = uint32(std::max(0, (*dmgShieldItr)->GetAmount())); // xinef: done calculated at amount calculation
2000
2001 if (Unit* caster = (*dmgShieldItr)->GetCaster())
2002 {
2003 damage = caster->SpellDamageBonusDone(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE, (*dmgShieldItr)->GetEffIndex());
2004 damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE);
2005 }
2006
2007 uint32 absorb = 0;
2008
2009 DamageInfo dmgInfo(victim, this, damage, i_spellProto, i_spellProto->GetSchoolMask(), SPELL_DIRECT_DAMAGE);
2010 Unit::CalcAbsorbResist(dmgInfo);
2011 absorb = dmgInfo.GetAbsorb();
2012 damage = dmgInfo.GetDamage();
2013
2014 Unit::DealDamageMods(this, damage, &absorb);
2015
2017 WorldPacket data(SMSG_SPELLDAMAGESHIELD, (8 + 8 + 4 + 4 + 4 + 4));
2018 data << victim->GetGUID();
2019 data << GetGUID();
2020 data << uint32(i_spellProto->Id);
2021 data << uint32(damage); // Damage
2022 int32 overkill = int32(damage) - int32(GetHealth());
2023 data << uint32(overkill > 0 ? overkill : 0); // Overkill
2024 data << uint32(i_spellProto->GetSchoolMask());
2025 victim->SendMessageToSet(&data, true);
2026
2027 Unit::DealDamage(victim, this, damage, 0, SPELL_DIRECT_DAMAGE, i_spellProto->GetSchoolMask(), i_spellProto, true);
2028 }
2029 }
2030}
@ CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN
Definition: CreatureData.h:48
@ CONFIG_ENABLE_DAZE
Definition: WorldConfig.h:144
@ EMOTE_ONESHOT_WOUND_CRITICAL
Definition: SharedDefines.h:1935
@ EMOTE_ONESHOT_PARRY_SHIELD
Definition: SharedDefines.h:1941
SpellMissInfo
Definition: SharedDefines.h:1529
@ SMSG_SPELLDAMAGESHIELD
Definition: Opcodes.h:621
bool isWorldBoss() const
Definition: Creature.h:121
bool HasFlagsExtra(uint32 flag) const
Definition: CreatureData.h:283
bool HasInArc(float arcangle, const Position *pos, float targetRadius=0.0f) const
Definition: Position.cpp:148
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition: Player.cpp:7271
uint32 GetUnitMeleeSkill(Unit const *target=nullptr) const
Definition: Unit.h:1116
void SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo)
Definition: Unit.cpp:6541
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition: Unit.cpp:3659
void SendSpellDamageImmune(Unit *target, uint32 spellId)
Definition: Unit.cpp:6565
SpellMissInfo SpellHitResult(Unit *victim, SpellInfo const *spell, bool canReflect=false)
Definition: Unit.cpp:3504
uint32 SpellDamageBonusTaken(Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
Definition: Unit.cpp:11883
void HandleEmoteCommand(uint32 emoteId)
Definition: Unit.cpp:2032
SpellSchoolMask GetSchoolMask() const
Definition: SpellInfo.cpp:1998

References CalcDamageInfo::absorb, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcAbsorbResist(), Player::CastItemCombatSpell(), CastSpell(), CalcDamageInfo::cleanDamage, CONFIG_ENABLE_DAZE, CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DealDamage(), DealDamageMods(), DIRECT_DAMAGE, EMOTE_ONESHOT_PARRY_SHIELD, EMOTE_ONESHOT_WOUND_CRITICAL, DamageInfo::GetAbsorb(), GetAttackTime(), getAttackTimer(), GetAuraEffectsByType(), Creature::GetCreatureTemplate(), DamageInfo::GetDamage(), GetDefenseSkillValue(), Object::GetGUID(), GetHealth(), GetLevel(), SpellInfo::GetSchoolMask(), GetUnitMeleeSkill(), HandleEmoteCommand(), HasActivePowerType(), CreatureTemplate::HasFlagsExtra(), Position::HasInArc(), HasOffhandWeaponForAttack(), HasUnitState(), CalcDamageInfo::HitInfo, HITINFO_CRITICALHIT, CalcDamageInfo::hitOutCome, SpellInfo::Id, IsAlive(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), IsVehicle(), Creature::isWorldBoss(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_GLANCING, MELEE_HIT_NORMAL, OFF_ATTACK, POWER_RAGE, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::resist, RewardRage(), roll_chance_f(), WorldObject::SendMessageToSet(), SendSpellDamageImmune(), SendSpellMiss(), setAttackTimer(), SMSG_SPELLDAMAGESHIELD, SPELL_AURA_DAMAGE_SHIELD, SPELL_DIRECT_DAMAGE, SpellDamageBonusTaken(), SpellHitResult(), sWorld, CalcDamageInfo::target, CalcDamageInfo::TargetState, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_IN_FLIGHT, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ DealSpellDamage()

void Unit::DealSpellDamage ( SpellNonMeleeDamage damageInfo,
bool  durabilityLoss,
Spell const *  spell = nullptr 
)
1471{
1472 if (damageInfo == 0)
1473 return;
1474
1475 Unit* victim = damageInfo->target;
1476
1477 if (!victim)
1478 return;
1479
1480 if (!victim->IsAlive() || victim->IsInFlight() || (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks()))
1481 return;
1482
1483 SpellInfo const* spellProto = damageInfo->spellInfo;
1484 if (!spellProto)
1485 {
1486 LOG_DEBUG("entities.unit", "Unit::DealSpellDamage has wrong damageInfo");
1487 return;
1488 }
1489
1490 // Call default DealDamage
1491 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL);
1492 Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss, false, spell);
1493}
SpellInfo const * spellInfo
Definition: Unit.h:498
bool IsInFlight() const
Definition: Unit.h:1622

References SpellNonMeleeDamage::absorb, BASE_ATTACK, SpellNonMeleeDamage::cleanDamage, SpellNonMeleeDamage::damage, DealDamage(), IsAlive(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsInFlight(), LOG_DEBUG, MELEE_HIT_NORMAL, SpellNonMeleeDamage::schoolMask, SPELL_DIRECT_DAMAGE, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, and Object::ToCreature().

Referenced by Spell::DoAllEffectOnTarget(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ DelayOwnedAuras()

void Unit::DelayOwnedAuras ( uint32  spellId,
ObjectGuid  caster,
int32  delaytime 
)
5528{
5529 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5530 for (; range.first != range.second; ++range.first)
5531 {
5532 Aura* aura = range.first->second;
5533 if (!caster || aura->GetCasterGUID() == caster)
5534 {
5535 if (aura->GetDuration() < delaytime)
5536 aura->SetDuration(0);
5537 else
5538 aura->SetDuration(aura->GetDuration() - delaytime);
5539
5540 // update for out of range group members (on 1 slot use)
5542 LOG_DEBUG("spells.aura", "Aura {} partially interrupted on unit {}, new duration: {} ms", aura->GetId(), GetGUID().ToString(), aura->GetDuration());
5543 }
5544 }
5545}
std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
Definition: Unit.h:627
int32 GetDuration() const
Definition: SpellAuras.h:133
void SetNeedClientUpdateForTargets() const
Definition: SpellAuras.cpp:1258
void SetDuration(int32 duration, bool withMods=false)
Definition: SpellAuras.cpp:868

References Aura::GetCasterGUID(), Aura::GetDuration(), Object::GetGUID(), Aura::GetId(), LOG_DEBUG, m_ownedAuras, Aura::SetDuration(), Aura::SetNeedClientUpdateForTargets(), and Position::ToString().

◆ DeleteCharmInfo()

void Unit::DeleteCharmInfo ( )
15907{
15908 if (!m_charmInfo)
15909 return;
15910
15912 delete m_charmInfo;
15913 m_charmInfo = nullptr;
15914}
void RestoreState()
Definition: CharmInfo.cpp:46

References m_charmInfo, and CharmInfo::RestoreState().

Referenced by RemoveCharmedBy().

◆ DeMorph()

void Unit::DeMorph ( )
4415{
4417}
virtual void SetDisplayId(uint32 modelId, float displayScale=1.f)
Definition: Unit.cpp:16845
uint32 GetNativeDisplayId() const
Definition: Unit.h:1892

References GetNativeDisplayId(), and SetDisplayId().

Referenced by modify_commandscript::HandleMorphResetCommand().

◆ DisableRotate()

void Unit::DisableRotate ( bool  apply)
18373{
18374 if (!IsCreature())
18375 return;
18376
18377 if (apply)
18381}
@ UNIT_STATE_POSSESSED
Definition: UnitDefines.h:186
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition: Unit.h:703

References HasUnitState(), Object::IsCreature(), RemoveUnitFlag(), SetUnitFlag(), UNIT_FLAG_POSSESSED, and UNIT_STATE_POSSESSED.

Referenced by boss_ingvar_the_plunderer::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_anub_arak::boss_anub_arakAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ DisableSpline()

◆ Dismount()

void Unit::Dismount ( )
13619{
13620 if (!IsMounted())
13621 return;
13622
13625
13626 if (Player* thisPlayer = ToPlayer())
13627 {
13628 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13629 data << GetPackGUID();
13630 data << uint32(GameTime::GetGameTime().count()); // Packet counter
13631 data << thisPlayer->GetCollisionHeight();
13632 thisPlayer->GetSession()->SendPacket(&data);
13633 }
13634
13635 WorldPacket data(SMSG_DISMOUNT, 8);
13636 data << GetPackGUID();
13637 SendMessageToSet(&data, true);
13638
13639 // dismount as a vehicle
13640 if (IsPlayer() && GetVehicleKit())
13641 {
13642 // Send other players that we are no longer a vehicle
13643 data.Initialize(SMSG_PLAYER_VEHICLE_DATA, 8 + 4);
13644 data << GetPackGUID();
13645 data << uint32(0);
13646 ToPlayer()->SendMessageToSet(&data, true);
13647 // Remove vehicle from player
13649 }
13650
13652
13653 // only resummon old pet if the player is already added to a map
13654 // this prevents adding a pet to a not created map which would otherwise cause a crash
13655 // (it could probably happen when logging in after a previous crash)
13656 if (Player* player = ToPlayer())
13657 {
13658 sScriptMgr->AnticheatSetUnderACKmount(player);
13659
13660 if (Pet* pPet = player->GetPet())
13661 {
13662 if (pPet->HasUnitFlag(UNIT_FLAG_STUNNED) && !pPet->HasUnitState(UNIT_STATE_STUNNED))
13663 pPet->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13664 }
13665 else
13666 player->ResummonPetTemporaryUnSummonedIfAny();
13667
13668 // xinef: if we have charmed npc, remove stun also
13669 if (Unit* charm = player->GetCharm())
13670 if (charm->IsCreature() && !charm->HasUnitState(UNIT_STATE_STUNNED))
13671 charm->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13672 }
13673}
@ AURA_INTERRUPT_FLAG_NOT_MOUNTED
Definition: SpellDefines.h:49
@ UNIT_FIELD_MOUNTDISPLAYID
Definition: UpdateFields.h:126
@ UNIT_FLAG_STUNNED
Definition: UnitDefines.h:270
@ UNIT_FLAG_MOUNT
Definition: UnitDefines.h:279
@ SMSG_PLAYER_VEHICLE_DATA
Definition: Opcodes.h:1221
@ SMSG_MOVE_SET_COLLISION_HGT
Definition: Opcodes.h:1332
@ SMSG_DISMOUNT
Definition: Opcodes.h:970
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition: Player.cpp:5705
void RemoveVehicleKit()
Definition: Unit.cpp:18824

References AURA_INTERRUPT_FLAG_NOT_MOUNTED, GetCharm(), GameTime::GetGameTime(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), IsMounted(), Object::IsPlayer(), RemoveAurasWithInterruptFlags(), RemoveUnitFlag(), RemoveVehicleKit(), WorldObject::SendMessageToSet(), Player::SendMessageToSet(), SetUInt32Value(), SMSG_DISMOUNT, SMSG_MOVE_SET_COLLISION_HGT, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, UNIT_FLAG_STUNNED, and UNIT_STATE_STUNNED.

Referenced by _EnterVehicle(), Player::CleanupAfterTaxiFlight(), FlightPathMovementGenerator::DoFinalize(), BattlegroundWS::EventPlayerClickedOnFlag(), AuraEffect::HandleAuraMounted(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), npc_scarlet_courier::npc_scarlet_courierAI::JustEngagedWith(), boss_mandokir::boss_mandokirAI::JustEngagedWith(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), boss_captain_skarloc::MovementInform(), spell_chapter5_light_of_dawn_aura::OnApply(), Creature::setDeathState(), SetInCombatState(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), npc_magister_aledis::StartFight(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), and npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI().

◆ EnergizeBySpell()

void Unit::EnergizeBySpell ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11364{
11365 int32 gainedPower = victim->ModifyPower(powerType, damage, false);
11366
11367 if (powerType != POWER_HAPPINESS && gainedPower)
11368 {
11369 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);
11370 victim->getHostileRefMgr().threatAssist(this, float(gainedPower) * 0.5f, spellInfo);
11371 }
11372
11373 SendEnergizeSpellLog(victim, spellID, damage, powerType);
11374}
@ POWER_HAPPINESS
Definition: SharedDefines.h:284
void threatAssist(Unit *victim, float baseThreat, SpellInfo const *threatSpell=nullptr)
Definition: HostileRefMgr.cpp:35
void SendEnergizeSpellLog(Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
Definition: Unit.cpp:11352

References getHostileRefMgr(), ModifyPower(), POWER_HAPPINESS, SendEnergizeSpellLog(), sSpellMgr, and HostileRefMgr::threatAssist().

Referenced by Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerDrain(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ EnterVehicle()

void Unit::EnterVehicle ( Unit base,
int8  seatId = -1 
)
19470{
19472
19473 if (Player* player = ToPlayer())
19474 {
19475 sScriptMgr->AnticheatSetUnderACKmount(player);
19476 }
19477}
@ TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE
Will ignore caster aura states including combat requirements and death state.
Definition: SpellDefines.h:146
@ VEHICLE_SPELL_RIDE_HARDCODED
Definition: VehicleDefines.h:52

References CastCustomSpell(), SPELLVALUE_BASE_POINT0, sScriptMgr, Object::ToPlayer(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, and VEHICLE_SPELL_RIDE_HARDCODED.

Referenced by debug_commandscript::HandleDebugEnterVehicleCommand(), WorldSession::HandleEnterPlayerVehicle(), boss_mimiron::boss_mimironAI::JustEngagedWith(), npc_pilgrims_bounty_chair::UpdateAI(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ EnterVehicleUnattackable()

void Unit::EnterVehicleUnattackable ( Unit base,
int8  seatId = -1 
)

◆ ExecuteDelayedUnitAINotifyEvent()

void Unit::ExecuteDelayedUnitAINotifyEvent ( )
20353{
20355 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20356 return;
20357
20358 Acore::AIRelocationNotifier notifier(*this);
20359 float radius = 60.0f;
20360 Cell::VisitObjects(this, notifier, radius);
20361}
@ NOTIFY_AI_RELOCATION
Definition: Object.h:69
void RemoveFromNotify(uint16 f)
Definition: Object.h:659
static void VisitObjects(WorldObject const *obj, T &visitor, float radius)
Definition: CellImpl.h:165
Definition: GridNotifiers.h:91

References IsDuringRemoveFromWorld(), Object::IsInWorld(), NOTIFY_AI_RELOCATION, WorldObject::RemoveFromNotify(), and Cell::VisitObjects().

Referenced by Update().

◆ ExecuteDelayedUnitRelocationEvent()

void Unit::ExecuteDelayedUnitRelocationEvent ( )
20252{
20254 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20255 return;
20256
20257 if (this->HasSharedVision())
20258 for (SharedVisionList::const_iterator itr = this->GetSharedVisionList().begin(); itr != this->GetSharedVisionList().end(); ++itr)
20259 if (Player* player = (*itr))
20260 {
20261 if (player->IsOnVehicle(this) || !player->IsInWorld() || player->IsDuringRemoveFromWorld()) // players on vehicles have their own event executed (due to passenger relocation)
20262 continue;
20263 WorldObject* viewPoint = player;
20264 if (player->m_seer && player->m_seer->IsInWorld())
20265 viewPoint = player->m_seer;
20266 if (!viewPoint->IsPositionValid() || !player->IsPositionValid())
20267 continue;
20268
20269 if (Unit* active = viewPoint->ToUnit())
20270 {
20271 //if (active->IsVehicle()) // always check original unit here, last notify position is not relocated
20272 // active = player;
20273
20274 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20275 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20276 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20277 float distsq = dx * dx + dy * dy + dz * dz;
20278 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20279 if (distsq < mindistsq)
20280 continue;
20281
20282 // this will be relocated below sharedvision!
20283 //active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20284 }
20285
20286 Acore::PlayerRelocationNotifier notifier(*player);
20287 Cell::VisitObjects(viewPoint, notifier, player->GetSightRange());
20289 notifier.SendToSelf();
20290 }
20291
20292 if (Player* player = this->ToPlayer())
20293 {
20294 WorldObject* viewPoint = player;
20295 if (player->m_seer && player->m_seer->IsInWorld())
20296 viewPoint = player->m_seer;
20297
20298 if (viewPoint->GetMapId() != player->GetMapId() || !viewPoint->IsPositionValid() || !player->IsPositionValid())
20299 return;
20300
20301 if (Unit* active = viewPoint->ToUnit())
20302 {
20303 if (active->IsVehicle())
20304 active = player;
20305
20306 if (!player->GetFarSightDistance())
20307 {
20308 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20309 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20310 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20311 float distsq = dx * dx + dy * dy + dz * dz;
20312
20313 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20314 if (distsq < mindistsq)
20315 return;
20316
20317 active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20318 }
20319 }
20320
20322
20323 Acore::PlayerRelocationNotifier notifier(*player);
20324 Cell::VisitObjects(viewPoint, notifier, player->GetSightRange());
20326 notifier.SendToSelf();
20327
20329 }
20330 else if (Creature* unit = this->ToCreature())
20331 {
20332 if (!unit->IsPositionValid())
20333 return;
20334
20335 float dx = unit->m_last_notify_position.GetPositionX() - unit->GetPositionX();
20336 float dy = unit->m_last_notify_position.GetPositionY() - unit->GetPositionY();
20337 float dz = unit->m_last_notify_position.GetPositionZ() - unit->GetPositionZ();
20338 float distsq = dx * dx + dy * dy + dz * dz;
20339 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(unit->FindMap()->GetEntry()->map_type);
20340 if (distsq < mindistsq)
20341 return;
20342
20343 unit->m_last_notify_position.Relocate(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ());
20344
20345 Acore::CreatureRelocationNotifier relocate(*unit);
20346 Cell::VisitObjects(unit, relocate, unit->GetVisibilityRange());
20347
20349 }
20350}
#define MAX_VISIBILITY_DISTANCE
Definition: ObjectDefines.h:30
#define VISIBILITY_DISTANCE_GIGANTIC
Definition: ObjectDefines.h:34
@ NOTIFY_VISIBILITY_CHANGED
Definition: Object.h:70
Unit * ToUnit()
Definition: Object.h:210
Definition: Object.h:472
void AddToNotify(uint16 f)
Definition: Object.cpp:2946
bool IsPositionValid() const
Definition: Position.cpp:183
uint32 GetMapId() const
Definition: Position.h:281
SharedVisionList const & GetSharedVisionList()
Definition: Unit.h:1793
bool HasSharedVision() const
Definition: Unit.h:1796
static void VisitFarVisibleObjects(WorldObject const *obj, T &visitor, float radius)
Definition: CellImpl.h:185
Definition: GridNotifiers.h:74
Definition: GridNotifiers.h:83
void LoadGridsInRange(Position const &center, float radius)
Definition: Map.cpp:222
static float GetReqMoveDistSq(uint32 map_type)
Definition: DynamicVisibility.h:53

References WorldObject::AddToNotify(), WorldObject::GetMap(), WorldLocation::GetMapId(), Position::GetPositionX(), DynamicVisibilityMgr::GetReqMoveDistSq(), GetSharedVisionList(), HasSharedVision(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Position::IsPositionValid(), Map::LoadGridsInRange(), MAX_VISIBILITY_DISTANCE, NOTIFY_AI_RELOCATION, NOTIFY_VISIBILITY_CHANGED, WorldObject::RemoveFromNotify(), Acore::VisibleNotifier::SendToSelf(), Object::ToCreature(), Object::ToPlayer(), Object::ToUnit(), VISIBILITY_DISTANCE_GIGANTIC, Cell::VisitFarVisibleObjects(), and Cell::VisitObjects().

◆ ExitVehicle()

void Unit::ExitVehicle ( Position const *  exitPosition = nullptr)

This function can be called at upper level code to initialize an exit from the passenger's side.

The following call would not even be executed successfully as the SPELL_AURA_CONTROL_VEHICLE unapply handler already calls _ExitVehicle without specifying an exitposition. The subsequent call below would return on if (!m_vehicle).

To do: We need to allow SPELL_AURA_CONTROL_VEHICLE unapply handlers in spellscripts to specify exit coordinates and either store those per passenger, or we need to init spline movement based on those coordinates in unapply handlers, and relocate exiting passengers based on Unit::moveSpline data. Either way, Coming Soon(TM)

19566{
19568 if (!m_vehicle)
19569 return;
19570
19572 if (Player* player = ToPlayer())
19573 {
19574 player->SetCanTeleport(true);
19575 }
19579 /*_ExitVehicle(exitPosition);*/
19586
19587 if (Player* player = ToPlayer())
19588 {
19589 sScriptMgr->AnticheatSetUnderACKmount(player);
19590 }
19591}
Unit * GetVehicleBase() const
Definition: Unit.cpp:18839

References Object::GetGUID(), GetVehicleBase(), m_vehicle, RemoveAurasByType(), SPELL_AURA_CONTROL_VEHICLE, sScriptMgr, and Object::ToPlayer().

Referenced by _EnterVehicle(), Player::ActivateTaxiPathTo(), MotionTransport::DelayedTeleportTransport(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), WorldSession::HandleDismissControlledVehicle(), spell_warhead_detonate::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_ulduar_squeezed_lifeless::HandleInstaKill(), WorldSession::HandleRequestVehicleExit(), spell_vehicle_throw_passenger::HandleScript(), boss_kologarn_arms::boss_kologarn_armsAI::JustDied(), spell_dragonblight_devour_ghoul_periodic::OnRemove(), Player::ProcessDelayedOperations(), RemoveFromWorld(), Player::StopCastingCharm(), and Player::TeleportTo().

◆ FindCurrentSpellBySpellId()

◆ FinishSpell()

void Unit::FinishSpell ( CurrentSpellTypes  spellType,
bool  ok = true 
)
4144{
4145 Spell* spell = m_currentSpells[spellType];
4146 if (!spell)
4147 return;
4148
4149 if (spellType == CURRENT_CHANNELED_SPELL)
4150 spell->SendChannelUpdate(0);
4151
4152 spell->finish(ok);
4153}
void SendChannelUpdate(uint32 time)
Definition: Spell.cpp:5129

References CURRENT_CHANNELED_SPELL, Spell::finish(), m_currentSpells, and Spell::SendChannelUpdate().

Referenced by AuraEffect::HandleFeignDeath(), AuraEffect::HandleModStealth(), npc_risen_archmage::npc_risen_archmageAI::JustEngagedWith(), boss_lord_marrowgar::UpdateAI(), and GameObject::Use().

◆ GetAffectingPlayer()

Player * Unit::GetAffectingPlayer ( ) const
10721{
10722 if (!GetCharmerOrOwnerGUID())
10723 return const_cast<Unit*>(this)->ToPlayer();
10724
10725 if (Unit* owner = GetCharmerOrOwner())
10727
10728 return nullptr;
10729}
ObjectGuid GetCharmerOrOwnerGUID() const
Definition: Unit.h:1224

References GetCharmerOrOwner(), GetCharmerOrOwnerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), and Object::ToPlayer().

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), GetFactionReactionTo(), and GetReactionTo().

◆ GetAI()

UnitAI * Unit::GetAI ( )
inline
648{ return i_AI; }

References i_AI.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), spell_algalon_big_bang::CheckTargets(), DealDamage(), DealHeal(), spell_send_mug_target_picker::FilterTargets(), spell_blood_queen_bloodbolt::FilterTargets(), spell_kologarn_focused_eyebeam::FilterTargetsInitial(), npc_dream_fog::npc_dream_fogAI::GetRandomUnitFromDragonThreatList(), WorldState::HandleActiveZone(), BattlegroundIC::HandleCapturedNodes(), spell_send_mug_target_picker::HandleDummy(), spell_magtheridon_shadow_grasp_visual::HandleDummyApply(), spell_mount_check_aura::HandleEffectPeriodic(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), spell_random_aggro::HandleOnHit(), spell_shadow_sickle_periodic_damage::HandlePeriodic(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_ayamiss_swarmer_start_loop::HandleScript(), spell_pursue::HandleScript(), spell_xt002_gravity_bomb_damage::HandleScript(), spell_the_lich_king_quake::HandleSendEvent(), npc_risen_guardian::npc_risen_guardianAI::IsSummonedBy(), npc_risen_guardian::npc_risen_guardianAI::KilledUnit(), ModifyPower(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), achievement_respect_your_elders::OnCheck(), achievement_hadronox_denied::OnCheck(), achievement_watch_him_die::OnCheck(), achievement_better_off_dred::OnCheck(), achievement_oh_novos::OnCheck(), achievement_share_the_love::OnCheck(), achievement_snakes_whyd_it_have_to_be_snakes::OnCheck(), achievement_im_on_a_boat::OnCheck(), achievement_all_you_can_eat::OnCheck(), achievement_been_waiting_long_time::OnCheck(), achievement_neck_deep_in_vile::OnCheck(), achievement_portal_jockey::OnCheck(), achievement_chaos_theory::OnCheck(), achievement_split_personality::OnCheck(), achievement_algalon_he_feeds_on_your_tears::OnCheck(), achievement_algalon_herald_of_the_titans::OnCheck(), achievement_flame_leviathan_towers::OnCheck(), achievement_flame_leviathan_shutout::OnCheck(), achievement_freya_getting_back_to_nature::OnCheck(), achievement_freya_knock_on_wood::OnCheck(), achievement_yogg_saron_drive_me_crazy::OnCheck(), achievement_yogg_saron_kiss_and_make_up::OnCheck(), achievement_intense_cold::OnCheck(), achievement_once_bitten_twice_shy::OnCheck(), spell_xt002_gravity_bomb_aura::OnPeriodic(), npc_dark_fiend::Reset(), spell_marrowgar_coldflame::SelectTarget(), and boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::SpellHit().

◆ GetAllMinionsByEntry()

void Unit::GetAllMinionsByEntry ( std::list< Creature * > &  Minions,
uint32  entry 
)
10947{
10948 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10949 {
10950 Unit* unit = *itr;
10951 ++itr;
10952 if (unit->GetEntry() == entry && unit->IsCreature()
10953 && unit->ToCreature()->IsSummon()) // minion, actually
10954 Minions.push_back(unit->ToCreature());
10955 }
10956}
bool IsSummon() const
Definition: Unit.h:746

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, and Object::ToCreature().

Referenced by spell_item_gift_of_the_harvester::CheckRequirement().

◆ GetAPMultiplier()

float Unit::GetAPMultiplier ( WeaponAttackType  attType,
bool  normalized 
)
17302{
17303 if (!normalized || !IsPlayer())
17304 return float(GetAttackTime(attType)) / 1000.0f;
17305
17306 Item* Weapon = ToPlayer()->GetWeaponForAttack(attType, true);
17307 if (!Weapon)
17308 return 2.4f; // fist attack
17309
17310 switch (Weapon->GetTemplate()->InventoryType)
17311 {
17312 case INVTYPE_2HWEAPON:
17313 return 3.3f;
17314 case INVTYPE_RANGED:
17316 case INVTYPE_THROWN:
17317 return 2.8f;
17318 case INVTYPE_WEAPON:
17321 default:
17322 return Weapon->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER ? 1.7f : 2.4f;
17323 }
17324}
@ ITEM_SUBCLASS_WEAPON_DAGGER
Definition: ItemTemplate.h:359
@ INVTYPE_RANGED
Definition: ItemTemplate.h:271
@ INVTYPE_THROWN
Definition: ItemTemplate.h:281
@ INVTYPE_RANGEDRIGHT
Definition: ItemTemplate.h:282
@ INVTYPE_WEAPON
Definition: ItemTemplate.h:269
@ INVTYPE_WEAPONMAINHAND
Definition: ItemTemplate.h:277
@ INVTYPE_WEAPONOFFHAND
Definition: ItemTemplate.h:278
@ INVTYPE_2HWEAPON
Definition: ItemTemplate.h:273
Weapon
Definition: boss_arlokk.cpp:67
Definition: Item.h:220
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition: PlayerStorage.cpp:488

References GetAttackTime(), Player::GetWeaponForAttack(), INVTYPE_2HWEAPON, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_THROWN, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, Object::IsPlayer(), ITEM_SUBCLASS_WEAPON_DAGGER, and Object::ToPlayer().

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and MeleeDamageBonusDone().

◆ GetAppliedAuras() [1/2]

◆ GetAppliedAuras() [2/2]

AuraApplicationMap const & Unit::GetAppliedAuras ( ) const
inline
1309{ return m_appliedAuras; }

References m_appliedAuras.

◆ GetArmor()

◆ getAttackerForHelper()

Unit * Unit::getAttackerForHelper ( ) const
756{
757 if (GetVictim() != nullptr)
758 return GetVictim();
759
760 if (!IsEngaged())
761 return nullptr;
762
763 if (!m_attackers.empty())
764 return *(m_attackers.begin());
765
766 return nullptr;
767}
bool IsEngaged() const
Definition: Unit.h:878

References GetVictim(), IsEngaged(), and m_attackers.

Referenced by Creature::_IsTargetAcceptable(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), PetAI::SelectNextTarget(), Creature::SelectVictim(), SetControlled(), TotemAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), and PetAI::UpdateAI().

◆ getAttackers()

◆ GetAttackTime()

◆ getAttackTimer()

◆ GetAura()

Aura * Unit::GetAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5647{
5648 AuraApplication* aurApp = GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask);
5649 return aurApp ? aurApp->GetBase() : nullptr;
5650}
AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition: Unit.cpp:5627

References GetAuraApplication(), and AuraApplication::GetBase().

Referenced by Player::_addSpell(), Pet::addSpell(), spell_mage_burning_determination::CheckProc(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_freya::boss_freyaAI::DoAction(), Spell::DoTriggersOnSpellHit(), Spell::EffectScriptEffect(), Spell::EffectTitanGrip(), Spell::EffectWeaponDmg(), getOrphanGUID(), spell_dk_scourge_strike::HandleAfterHit(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleAuraStacksCommand(), deserter_commandscript::HandleDeserterAdd(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_karazhan_wrath_titans_stacker::HandleDummy(), spell_charge_shield_bomber::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), HandleDummyAuraProc(), spell_yogg_saron_sanity_well_aura::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_sindragosa_frost_breath::HandleInfusion(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_putricide_unstable_experiment::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_pal_seal_of_vengeance::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_spiritual_insight::npc_spiritual_insightAI::IsSummonedBy(), npc_gunship::npc_gunshipAI::JustDied(), boss_high_nethermancer_zerevor::JustEngagedWith(), npc_brew_bubble::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), spell_summoning_rhyme_aura::PeriodicTick(), Player::ProcessDelayedOperations(), BattlefieldWG::PromotePlayer(), RemoveAurasDueToSpellBySteal(), Player::ResurrectPlayer(), SetAuraStack(), boss_anomalus::SetData(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_pilgrims_bounty_chair::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), boss_sindragosa::boss_sindragosaAI::SpellHitTarget(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::SpellHitTarget(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::SpellHitTarget(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ GetAuraApplication()

AuraApplication * Unit::GetAuraApplication ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5628{
5629 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5630 for (; range.first != range.second; ++range.first)
5631 {
5632 AuraApplication* app = range.first->second;
5633 Aura const* aura = app->GetBase();
5634
5635 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
5636 && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5637 && (!itemCasterGUID || aura->GetCastItemGUID() == itemCasterGUID)
5638 && (!except || except != app))
5639 {
5640 return app;
5641 }
5642 }
5643 return nullptr;
5644}
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition: Unit.h:630
uint8 GetEffectMask() const
Definition: SpellAuras.h:176
ObjectGuid GetCastItemGUID() const
Definition: SpellAuras.h:103

References AuraApplication::GetBase(), Aura::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetEffectMask(), and m_appliedAuras.

Referenced by AuraApplication::_Remove(), GetAura(), GetAuraApplicationOfRankedSpell(), HasAura(), and Spell::UpdateChanneledTargetList().

◆ GetAuraApplicationOfRankedSpell()

AuraApplication * Unit::GetAuraApplicationOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5653{
5654 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5655 while (rankSpell)
5656 {
5657 if (AuraApplication* aurApp = GetAuraApplication(rankSpell, casterGUID, itemCasterGUID, reqEffMask, except))
5658 return aurApp;
5659 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5660 }
5661 return nullptr;
5662}

References GetAuraApplication(), and sSpellMgr.

Referenced by spell_warl_drain_soul::CheckProc(), and GetAuraOfRankedSpell().

◆ GetAuraCount()

uint32 Unit::GetAuraCount ( uint32  spellId) const
5748{
5749 uint32 count = 0;
5750 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5751
5752 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5753 {
5754 if (itr->second->GetBase()->GetStackAmount() == 0)
5755 ++count;
5756 else
5757 count += (uint32)itr->second->GetBase()->GetStackAmount();
5758 }
5759
5760 return count;
5761}

References m_appliedAuras.

Referenced by npc_brew_bubble::MoveInLineOfSight(), spell_valithria_suppression_aura::OnApply(), achievement_consumption_junction::OnCheck(), achievement_assembly_of_iron::OnCheck(), achievement_cant_do_that_while_stunned::OnCheck(), spell_valithria_suppression_aura::OnRemove(), SmartScript::ProcessEvent(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), spell_black_temple_spell_absorption_aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ GetAuraEffect() [1/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5600{
5601 AuraEffectList const& auras = GetAuraEffectsByType(type);
5602 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5603 {
5604 SpellInfo const* spell = (*i)->GetSpellInfo();
5605 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5606 {
5607 if (casterGUID && (*i)->GetCasterGUID() != casterGUID)
5608 continue;
5609 return (*i);
5610 }
5611 }
5612 return nullptr;
5613}
bool HasFlag(uint32 p1=0, uint32 p2=0, uint32 p3=0) const
Definition: Util.h:468
flag96 SpellFamilyFlags
Definition: SpellInfo.h:388
uint32 SpellFamilyName
Definition: SpellInfo.h:387

References GetAuraEffectsByType(), flag96::HasFlag(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

◆ GetAuraEffect() [2/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  name,
uint32  iconId,
uint8  effIndex 
) const
5586{
5587 AuraEffectList const& auras = GetAuraEffectsByType(type);
5588 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5589 {
5590 if (effIndex != (*itr)->GetEffIndex())
5591 continue;
5592 SpellInfo const* spell = (*itr)->GetSpellInfo();
5593 if (spell->SpellIconID == iconId && spell->SpellFamilyName == name)
5594 return *itr;
5595 }
5596 return nullptr;
5597}
uint32 SpellIconID
Definition: SpellInfo.h:380

References GetAuraEffectsByType(), SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

◆ GetAuraEffect() [3/3]

AuraEffect * Unit::GetAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5560{
5561 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5562 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5563 {
5564 if (itr->second->HasEffect(effIndex)
5565 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5566 {
5567 return itr->second->GetBase()->GetEffect(effIndex);
5568 }
5569 }
5570 return nullptr;
5571}

References m_appliedAuras.

Referenced by CalculateSpellAmount(), Spell::CanAutoCast(), spell_mage_ice_barrier::CheckCast(), spell_pri_power_word_shield::CheckCast(), spell_mage_molten_armor::CheckProc(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectWeaponDmg(), spell_dru_t10_restoration_4p_bonus::FilterTargets(), GetAuraEffectOfRankedSpell(), GetDummyAuraEffect(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_dk_raise_ally::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_warr_execute::HandleEffect(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pri_divine_aegis::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleShapeshiftBoosts(), spell_warl_drain_soul::HandleTick(), npc_pet_dk_ebon_gargoyle::InitializeAI(), Guardian::InitStatsForLevel(), npc_anzu_spirit::IsSummonedBy(), MeleeDamageBonusDone(), ModSpellDuration(), spell_dk_death_and_decay::RecalculateDamage(), RemoveAurasDueToSpellByDispel(), SpellDamageBonusDone(), SpellHealingBonusTaken(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), and npc_hallows_end_train_fire::UpdateAI().

◆ GetAuraEffectDummy()

AuraEffect * Unit::GetAuraEffectDummy ( uint32  spellid) const
5616{
5618 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5619 {
5620 if ((*itr)->GetId() == spellid)
5621 return *itr;
5622 }
5623
5624 return nullptr;
5625}
@ SPELL_AURA_DUMMY
Definition: SpellAuraDefines.h:67

References GetAuraEffectsByType(), and SPELL_AURA_DUMMY.

Referenced by Spell::EffectWeaponDmg(), Aura::HandleAuraSpecificMods(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), Guardian::InitStatsForLevel(), Kill(), spell_dk_death_and_decay::RecalculateDamage(), Player::RemoveSpellMods(), and SpellHealingBonusTaken().

◆ GetAuraEffectOfRankedSpell()

AuraEffect * Unit::GetAuraEffectOfRankedSpell ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5574{
5575 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5576 while (rankSpell)
5577 {
5578 if (AuraEffect* aurEff = GetAuraEffect(rankSpell, effIndex, caster))
5579 return aurEff;
5580 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5581 }
5582 return nullptr;
5583}
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition: Unit.cpp:5559

References GetAuraEffect(), and sSpellMgr.

Referenced by spell_mage_fire_frost_ward::Absorb(), spell_sha_earthbind_totem::Apply(), spell_sha_earthliving_weapon::CheckProc(), GetDiseasesByCaster(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), SpellPctDamageModsDone(), and spell_mage_incanters_absorbtion_base_AuraScript::Trigger().

◆ GetAuraEffectsByType()

AuraEffectList const & Unit::GetAuraEffectsByType ( AuraType  type) const
inline
1353{ return m_modAuras[type]; }

References m_modAuras.

Referenced by Player::_ApplyWeaponDependentAuraMods(), Spell::_cast(), AuraApplication::_HandleEffect(), KillRewarder::_RewardXP(), CalcAbsorbResist(), CalcArmorReducedDamage(), CalcHealAbsorb(), AuraEffect::CalculateAmount(), Player::CalculateQuestRewardXP(), Spell::CheckCast(), Spell::CheckCasterAuras(), DealDamage(), DealMeleeDamage(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), spell_dk_wandering_plague::FilterTargets(), GetAuraEffect(), GetAuraEffectDummy(), GetDoTsByCaster(), GetMagicHitRedirectTarget(), GetMaxNegativeAuraModifier(), GetMaxNegativeAuraModifierByAffectMask(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifier(), GetMaxPositiveAuraModifierByAffectMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscValue(), Player::getMaxTimer(), GetMeleeHitRedirectTarget(), GetPhaseByAuras(), Player::GetResurrectionSpellId(), Player::GetRuneBaseCooldown(), GetTotalAuraModifier(), GetTotalAuraModifierAreaExclusive(), GetTotalAuraModifierByAffectMask(), GetTotalAuraModifierByMiscMask(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByAffectMask(), GetTotalAuraMultiplierByMiscMask(), GetTotalAuraMultiplierByMiscValue(), GetUnitCriticalChance(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), AuraEffect::HandleAuraTransform(), AuraEffect::HandleDetectAmore(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), HandleDummyAuraProc(), Spell::HandleLaunchPhase(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMirrorImageDataRequest(), AuraEffect::HandleModInvisibility(), modify_commandscript::HandleMorphMountCommand(), AuraEffect::HandleNoReagentUseAura(), spell_warr_heroic_strike::HandleOnHit(), spell_illidari_council_judgement::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), HasAuraState(), HasAuraTypeWithAffectMask(), HasAuraTypeWithCaster(), HasAuraTypeWithFamilyFlags(), HasAuraTypeWithMiscvalue(), HasAuraTypeWithTriggerSpell(), HasAuraTypeWithValue(), HasBreakableByDamageAuraType(), HasVisibleAuraType(), IsImmunedToSpellEffect(), IsScriptOverriden(), SpellInfo::IsStrongerAuraActive(), Player::isTotalImmune(), list_commandscript::ListAurasCommand(), MeleeDamageBonusDone(), MeleeDamageBonusTaken(), MeleeSpellHitResult(), Spell::PrepareTriggersExecutedOnHit(), processDummyAuras(), spell_dru_enrage::RecalculateBaseArmor(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::Respawn(), RestoreDisplayId(), Spell::SelectImplicitAreaTargets(), Spell::SelectImplicitConeTargets(), PetAI::SelectNextTarget(), Creature::SelectVictim(), Player::SendInitialPacketsAfterAddToMap(), SetControlled(), Player::SetEntryPoint(), Player::SetSkill(), SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SpellBaseHealingBonusDone(), SpellBaseHealingBonusTaken(), SpellDamageBonusDone(), SpellDamageBonusTaken(), SpellHealingBonusDone(), SpellHealingBonusTaken(), SpellHitResult(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), Player::SummonPet(), Player::TeleportTo(), SimpleCharmedAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), Player::UpdateArmor(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCharmedAI(), Player::UpdateExpertise(), Player::UpdateManaRegen(), Player::UpdateRating(), Player::UpdateResistances(), UpdateSpeed(), and Player::UpdateStats().

◆ GetAuraOfRankedSpell()

Aura * Unit::GetAuraOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5665{
5666 AuraApplication* aurApp = GetAuraApplicationOfRankedSpell(spellId, casterGUID, itemCasterGUID, reqEffMask);
5667 return aurApp ? aurApp->GetBase() : nullptr;
5668}
AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition: Unit.cpp:5652

References GetAuraApplicationOfRankedSpell(), and AuraApplication::GetBase().

Referenced by Aura::HandleAuraSpecificMods(), and spell_dk_pestilence::HandleScriptEffect().

◆ GetBoundaryRadius()

float Unit::GetBoundaryRadius ( ) const
inline
@ UNIT_FIELD_BOUNDINGRADIUS
Definition: UpdateFields.h:122

References Object::m_floatValues, and UNIT_FIELD_BOUNDINGRADIUS.

Referenced by IsWithinBoundaryRadius().

◆ GetCastingTimeForBonus()

uint32 Unit::GetCastingTimeForBonus ( SpellInfo const *  spellProto,
DamageEffectType  damagetype,
uint32  CastingTime 
) const
17162{
17163 // Not apply this to creature casted spells with casttime == 0
17164 if (CastingTime == 0 && IsCreature() && !IsPet())
17165 return 3500;
17166
17167 if (CastingTime > 7000) CastingTime = 7000;
17168 if (CastingTime < 1500) CastingTime = 1500;
17169
17170 if (damagetype == DOT && !spellProto->IsChanneled())
17171 CastingTime = 3500;
17172
17173 int32 overTime = 0;
17174 uint8 effects = 0;
17175 bool DirectDamage = false;
17176 bool AreaEffect = false;
17177
17178 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; i++)
17179 {
17180 switch (spellProto->Effects[i].Effect)
17181 {
17187 case SPELL_EFFECT_HEAL:
17188 DirectDamage = true;
17189 break;
17191 switch (spellProto->Effects[i].ApplyAuraName)
17192 {
17196 if (spellProto->GetDuration())
17197 overTime = spellProto->GetDuration();
17198 break;
17199 default:
17200 // -5% per additional effect
17201 ++effects;
17202 break;
17203 }
17204 default:
17205 break;
17206 }
17207
17208 if (spellProto->Effects[i].IsTargetingArea())
17209 AreaEffect = true;
17210 }
17211
17212 // Combined Spells with Both Over Time and Direct Damage
17213 if (overTime > 0 && DirectDamage)
17214 {
17215 // mainly for DoTs which are 3500 here otherwise
17216 uint32 OriginalCastTime = spellProto->CalcCastTime();
17217 if (OriginalCastTime > 7000) OriginalCastTime = 7000;
17218 if (OriginalCastTime < 1500) OriginalCastTime = 1500;
17219 // Portion to Over Time
17220 float PtOT = (overTime / 15000.0f) / ((overTime / 15000.0f) + (OriginalCastTime / 3500.0f));
17221
17222 if (damagetype == DOT)
17223 CastingTime = uint32(CastingTime * PtOT);
17224 else if (PtOT < 1.0f)
17225 CastingTime = uint32(CastingTime * (1 - PtOT));
17226 else
17227 CastingTime = 0;
17228 }
17229
17230 // Area Effect Spells receive only half of bonus
17231 if (AreaEffect)
17232 CastingTime /= 2;
17233
17234 // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing
17235 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
17236 {
17237 if (spellProto->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH ||
17238 (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH))
17239 {
17240 CastingTime /= 2;
17241 break;
17242 }
17243 }
17244
17245 // -5% of total per any additional effect
17246 for (uint8 i = 0; i < effects; ++i)
17247 CastingTime *= 0.95f;
17248
17249 return CastingTime;
17250}
@ SPELL_AURA_PERIODIC_DAMAGE
Definition: SpellAuraDefines.h:66
@ SPELL_AURA_PERIODIC_HEAL
Definition: SpellAuraDefines.h:71
@ SPELL_AURA_PERIODIC_LEECH
Definition: SpellAuraDefines.h:116
@ SPELL_EFFECT_POWER_BURN
Definition: SharedDefines.h:851
@ SPELL_EFFECT_HEALTH_LEECH
Definition: SharedDefines.h:798
@ SPELL_EFFECT_HEAL
Definition: SharedDefines.h:799
@ SPELL_EFFECT_ENVIRONMENTAL_DAMAGE
Definition: SharedDefines.h:796
@ SPELL_EFFECT_POWER_DRAIN
Definition: SharedDefines.h:797
@ SPELL_EFFECT_SCHOOL_DAMAGE
Definition: SharedDefines.h:791
@ SPELL_EFFECT_APPLY_AURA
Definition: SharedDefines.h:795

References SpellInfo::CalcCastTime(), DOT, SpellInfo::Effects, SpellInfo::GetDuration(), SpellInfo::IsChanneled(), Object::IsCreature(), IsPet(), MAX_SPELL_EFFECTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_EFFECT_APPLY_AURA, SPELL_EFFECT_ENVIRONMENTAL_DAMAGE, SPELL_EFFECT_HEAL, SPELL_EFFECT_HEALTH_LEECH, SPELL_EFFECT_POWER_BURN, SPELL_EFFECT_POWER_DRAIN, and SPELL_EFFECT_SCHOOL_DAMAGE.

Referenced by CalculateDefaultCoefficient().

◆ GetCharm()

Unit * Unit::GetCharm ( ) const
10767{
10768 if (ObjectGuid charm_guid = GetCharmGUID())
10769 {
10770 if (Unit* pet = ObjectAccessor::GetUnit(*this, charm_guid))
10771 return pet;
10772
10773 LOG_ERROR("entities.unit", "Unit::GetCharm: Charmed creature {} not exist.", charm_guid.ToString());
10775 }
10776
10777 return nullptr;
10778}
@ UNIT_FIELD_CHARM
Definition: UpdateFields.h:86
Unit * GetUnit(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:199
void SetGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:712
ObjectGuid GetCharmGUID() const
Definition: Unit.h:676

References ObjectGuid::Empty, GetCharmGUID(), ObjectAccessor::GetUnit(), LOG_ERROR, Object::SetGuidValue(), and UNIT_FIELD_CHARM.

Referenced by Spell::_cast(), AddPetAura(), spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Dismount(), Spell::finish(), GetFirstControlled(), spell_warl_eye_of_kilrogg::HandleAuraApply(), spell_warl_eye_of_kilrogg::HandleAuraRemove(), spell_dk_raise_ally::HandleDummy(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), WorldSession::HandleRequestPetInfo(), isPossessing(), Mount(), Player::PossessSpellInitialize(), RemovePetAura(), Spell::SelectImplicitCasterObjectTargets(), SetSpeed(), npc_pilgrims_bounty_chair::SpellHitTarget(), and Player::StopCastingCharm().

◆ GetCharmer()

◆ GetCharmerGUID()

◆ GetCharmerOrOwner()

◆ GetCharmerOrOwnerGUID()

◆ GetCharmerOrOwnerOrOwnGUID()

◆ GetCharmerOrOwnerOrSelf()

Unit * Unit::GetCharmerOrOwnerOrSelf ( ) const
inline
1217 {
1218 if (Unit* u = GetCharmerOrOwner())
1219 return u;
1220
1221 return (Unit*)this;
1222 }

References GetCharmerOrOwner().

Referenced by CombatStart(), CombatStartOnCast(), GetPartyMembers(), GetReactionTo(), IsInPartyWith(), IsInRaidWith(), SetInCombatWith(), and TotemAI::UpdateAI().

◆ GetCharmerOrOwnerPlayerOrPlayerItself()

Player * Unit::GetCharmerOrOwnerPlayerOrPlayerItself ( ) const
10712{
10714 if (guid.IsPlayer())
10715 return ObjectAccessor::GetPlayer(*this, guid);
10716
10717 return const_cast<Unit*>(this)->ToPlayer();
10718}
Player * GetPlayer(Map const *, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:220

References GetCharmerOrOwnerGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), and Object::ToPlayer().

Referenced by Spell::_handle_finish_phase(), spell_sha_earthbind_totem::Apply(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), BuildValuesUpdate(), spell_q12237_rescue_villager::CheckCast(), spell_q12237_drop_off_villager::CheckCast(), CombatStart(), CombatStartOnCast(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), DealDamage(), Spell::EffectGameObjectSetDestructionState(), Spell::EffectKillCredit(), Spell::EffectKillCreditPersonal(), Spell::EffectSummonPet(), GetAffectingPlayer(), Object::GetUpdateFieldData(), spell_gen_charmed_unit_spell_cooldown::HandleCast(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_q12851_going_bearback::HandleEffectApply(), spell_q12726_song_of_wind_and_water::HandleHealPct(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_q10769_dissension_amongst_the_ranks::HandleScriptEffect(), npc_pet_gen_valkyr_guardian::InitializeAI(), isTargetableForAttack(), GuardAI::JustDied(), boss_kurinnaxx::JustDied(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustDied(), npc_darnavan::npc_darnavanAI::JustDied(), npc_four_car_garage::npc_four_car_garageAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), Kill(), Condition::Meets(), GameObject::ModifyHealth(), npc_amanishi_lookout::MoveInLineOfSight(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), SmartScript::ProcessAction(), ProcessTerrainStatusUpdate(), Pet::RemoveSpellCooldown(), Spell::SendSpellCooldown(), SetCharm(), SetContestedPvP(), SetInCombatState(), Creature::SetLootRecipient(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::SpellHit(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), and Creature::UpdateEntry().

◆ GetCharmGUID()

◆ GetCharmInfo()

◆ getClass()

uint8 Unit::getClass ( ) const
inline
795{ return GetByteValue(UNIT_FIELD_BYTES_0, 1); }
@ UNIT_FIELD_BYTES_0
Definition: UpdateFields.h:95
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition: Object.cpp:312

References Object::GetByteValue(), and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), ArenaTeam::AddMember(), SpellEffectInfo::CalcValue(), Player::CheckSkillLearnedBySpell(), getClassMask(), GetDebugInfo(), Player::GetDodgeFromAgility(), SocialMgr::GetFriendInfo(), Player::GetMeleeCritFromAgility(), Player::GetMissPercentageFromDefence(), Player::GetPlayerName(), Player::GetRatingMultiplier(), Player::GetSpec(), Player::GetSpellCritFromIntellect(), Player::GetStartPosition(), Player::GiveLevel(), spell_item_flask_of_the_north::HandleDummy(), HandleDummyAuraProc(), learn_commandscript::HandleLearnAllMySpellsCommand(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), HandleProcTriggerSpell(), ArenaSpectator::HandleResetCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDataForForm(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Player::IsClass(), IsClass(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), ClassCallSelector::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), Player::RewardHonor(), WorldSession::SendNameQueryOpcode(), Guild::Member::SetStats(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Player::StoreNewItemInBestSlots(), Player::UpdateDodgePercentage(), Player::UpdateParryPercentage(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getClassMask()

◆ GetCollisionHeight()

float Unit::GetCollisionHeight ( ) const
overridevirtual

Return collision height sent to client.

Reimplemented from WorldObject.

20967{
20968 float scaleMod = GetObjectScale(); // 99% sure about this
20969 float defaultHeight = DEFAULT_COLLISION_HEIGHT * scaleMod;
20970
20971 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
20972 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
20973 float collisionHeight = 0.0f;
20974
20975 if (IsMounted())
20976 {
20978 {
20979 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
20980 {
20981 collisionHeight = scaleMod * (mountModelData->MountHeight + modelData->CollisionHeight * modelData->Scale * displayInfo->scale * 0.5f);
20982 }
20983 }
20984 }
20985 else
20986 collisionHeight = scaleMod * modelData->CollisionHeight * modelData->Scale * displayInfo->scale;
20987
20988 return collisionHeight == 0.0f ? defaultHeight : collisionHeight;
20989}
#define DEFAULT_COLLISION_HEIGHT
Definition: ObjectDefines.h:49
DBCStorage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore(CreatureDisplayInfofmt)
DBCStorage< CreatureModelDataEntry > sCreatureModelDataStore(CreatureModelDatafmt)
float GetObjectScale() const
Definition: Object.h:119
Definition: DBCStructure.h:721
uint32 ModelId
Definition: DBCStructure.h:723
float scale
Definition: DBCStructure.h:726
Definition: DBCStructure.h:775
float Scale
Definition: DBCStructure.h:779
float CollisionHeight
Definition: DBCStructure.h:790

References CreatureModelDataEntry::CollisionHeight, DEFAULT_COLLISION_HEIGHT, GetNativeDisplayId(), Object::GetObjectScale(), Object::GetUInt32Value(), IsMounted(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by DynObjAura::FillTargetMap(), GetRandomContactPoint(), WorldSession::HandleMovementOpcodes(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Spell::SelectImplicitCasterDestTargets(), spell_spawn_blood_pool::SetDest(), and Creature::UpdateMovementFlags().

◆ GetCollisionRadius()

float Unit::GetCollisionRadius ( ) const
overridevirtual

this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the radius also takes in consideration the mount size

Returns
float The radius of a unit

Reimplemented from WorldObject.

20961{
20962 return GetCollisionWidth() / 2;
20963}
float GetCollisionWidth() const override
this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by...
Definition: Unit.cpp:20923

References GetCollisionWidth().

Referenced by GetMeleeAttackPoint(), and Creature::Update().

◆ GetCollisionWidth()

float Unit::GetCollisionWidth ( ) const
overridevirtual

this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the diameter also takes in consideration the mount size

Returns
float The diameter of a unit

Dismounting case - use basic default model data

Reimplemented from WorldObject.

20924{
20925 if (IsPlayer())
20926 return GetObjectSize();
20927
20928 float scaleMod = GetObjectScale(); // 99% sure about this
20929 float objectSize = GetObjectSize();
20930 float defaultSize = DEFAULT_WORLD_OBJECT_SIZE * scaleMod;
20931
20933 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
20934 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
20935
20936 if (IsMounted())
20937 {
20939 {
20940 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
20941 {
20942 if (G3D::fuzzyGt(mountModelData->CollisionWidth, modelData->CollisionWidth))
20943 modelData = mountModelData;
20944 }
20945 }
20946 }
20947
20948 float collisionWidth = scaleMod * modelData->CollisionWidth * modelData->Scale * displayInfo->scale * 2;
20949 // if the objectSize is the default value or the creature is mounted and we have a DBC value, then we can retrieve DBC value instead
20950 return G3D::fuzzyGt(collisionWidth, 0.0f) && (G3D::fuzzyEq(objectSize,defaultSize) || IsMounted()) ? collisionWidth : objectSize;
20951}
#define DEFAULT_WORLD_OBJECT_SIZE
Definition: ObjectDefines.h:44
float GetObjectSize() const
Definition: Object.cpp:2764
float CollisionWidth
Definition: DBCStructure.h:789

References CreatureModelDataEntry::CollisionWidth, DEFAULT_WORLD_OBJECT_SIZE, GetNativeDisplayId(), Object::GetObjectScale(), WorldObject::GetObjectSize(), Object::GetUInt32Value(), IsMounted(), Object::IsPlayer(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by GetCollisionRadius().

◆ GetCombatRatingDamageReduction()

uint32 Unit::GetCombatRatingDamageReduction ( CombatRating  cr,
float  rate,
float  cap,
uint32  damage 
) const
private
19292{
19293 float percent = std::min(GetCombatRatingReduction(cr) * rate, cap);
19294 return CalculatePct(damage, percent);
19295}
float GetCombatRatingReduction(CombatRating cr) const
Definition: Unit.cpp:19279

References CalculatePct(), and GetCombatRatingReduction().

Referenced by GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritDamageReduction(), and GetSpellDamageReduction().

◆ GetCombatRatingReduction()

float Unit::GetCombatRatingReduction ( CombatRating  cr) const
private
19280{
19281 if (Player const* player = ToPlayer())
19282 return player->GetRatingBonusValue(cr);
19283 // Player's pet get resilience from owner
19284 else if (IsPet() && GetOwner())
19285 if (Player* owner = GetOwner()->ToPlayer())
19286 return owner->GetRatingBonusValue(cr);
19287
19288 return 0.0f;
19289}

References GetOwner(), IsPet(), and Object::ToPlayer().

Referenced by GetCombatRatingDamageReduction(), GetMeleeCritChanceReduction(), GetRangedCritChanceReduction(), and GetSpellCritChanceReduction().

◆ GetCombatReach()

◆ GetCombatTimer()

uint32 Unit::GetCombatTimer ( ) const
inline
891{ return m_CombatTimer; }

References m_CombatTimer.

Referenced by Spell::DoSpellHitOnUnit(), and SetInCombatState().

◆ GetComboPoints() [1/2]

uint8 Unit::GetComboPoints ( ObjectGuid const &  guid) const
inline
956{ return (m_comboTarget && m_comboTarget->GetGUID() == guid) ? m_comboPoints : 0; }

References Object::GetGUID(), m_comboPoints, and m_comboTarget.

◆ GetComboPoints() [2/2]

uint8 Unit::GetComboPoints ( Unit const *  who = nullptr) const
inline

◆ GetComboTarget()

Unit * Unit::GetComboTarget ( ) const
inline
957{ return m_comboTarget; }

References m_comboTarget.

Referenced by Player::DuelComplete(), and HandleProcTriggerSpell().

◆ GetComboTargetGUID()

ObjectGuid const Unit::GetComboTargetGUID ( ) const
inline

◆ GetCompanionPet()

Creature * Unit::GetCompanionPet ( ) const
10762{
10764}
@ SUMMON_SLOT_MINIPET
Definition: SharedDefines.h:3566
Creature * GetCreature(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:210

References ObjectAccessor::GetCreature(), m_SummonSlot, and SUMMON_SLOT_MINIPET.

Referenced by HandleProcTriggerSpell().

◆ GetCreateHealth()

◆ GetCreateMana()

◆ GetCreatePowers()

uint32 Unit::GetCreatePowers ( Powers  power) const
15748{
15749 // Only hunter pets have POWER_FOCUS and POWER_HAPPINESS
15750 switch (power)
15751 {
15752 case POWER_MANA:
15753 return GetCreateMana();
15754 case POWER_RAGE:
15755 return 1000;
15756 case POWER_FOCUS:
15757 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 100);
15758 case POWER_ENERGY:
15759 return 100;
15760 case POWER_HAPPINESS:
15761 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 1050000);
15762 case POWER_RUNIC_POWER:
15763 return 1000;
15764 case POWER_RUNE:
15765 return 0;
15766 case POWER_HEALTH:
15767 return 0;
15768 default:
15769 break;
15770 }
15771
15772 return 0;
15773}
@ POWER_HEALTH
Definition: SharedDefines.h:289
@ POWER_RUNIC_POWER
Definition: SharedDefines.h:286
@ POWER_ENERGY
Definition: SharedDefines.h:283
@ POWER_RUNE
Definition: SharedDefines.h:285
@ POWER_FOCUS
Definition: SharedDefines.h:282
uint32 GetCreateMana() const
Definition: Unit.h:1074

References GetCreateMana(), HUNTER_PET, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_HEALTH, POWER_MANA, POWER_RAGE, POWER_RUNE, and POWER_RUNIC_POWER.

Referenced by Pet::CreateBaseAtTamed(), HandleDummyAuraProc(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), setPowerType(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ GetCreateStat()

float Unit::GetCreateStat ( Stats  stat) const
inline

◆ GetCreatorGUID()

ObjectGuid Unit::GetCreatorGUID ( ) const
inline
@ UNIT_FIELD_CREATEDBY
Definition: UpdateFields.h:91

References Object::GetGuidValue(), and UNIT_FIELD_CREATEDBY.

Referenced by Condition::Meets().

◆ GetCreatureType()

uint32 Unit::GetCreatureType ( ) const
15284{
15285 if (IsPlayer())
15286 {
15288 SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);
15289 if (ssEntry && ssEntry->creatureType > 0)
15290 return ssEntry->creatureType;
15291 else
15293 }
15294 else
15295 return ToCreature()->GetCreatureTemplate()->type;
15296}
ShapeshiftForm
Definition: UnitDefines.h:68
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormEntryfmt)
@ CREATURE_TYPE_HUMANOID
Definition: SharedDefines.h:2645
uint32 type
Definition: CreatureData.h:222
ShapeshiftForm GetShapeshiftForm() const
Definition: Unit.h:1873
Definition: DBCStructure.h:1818
int32 creatureType
Definition: DBCStructure.h:1824

References CREATURE_TYPE_HUMANOID, SpellShapeshiftFormEntry::creatureType, Creature::GetCreatureTemplate(), GetShapeshiftForm(), Object::IsPlayer(), sSpellShapeshiftFormStore, Object::ToCreature(), and CreatureTemplate::type.

Referenced by Creature::CanStartAttack(), spell_utgarde_pinnacle_beast_mark::CheckProc(), Spell::EffectKnockBack(), spell_dk_death_pact::FilterTargets(), GetCreatureTypeMask(), GetUnitParryChance(), AuraEffect::HandleAuraEmpathy(), spell_dru_starfall_dummy::HandleDummy(), IsCritter(), CreatureAI::MoveInLineOfSight(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnUnitDeath(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), SetInCombatState(), and Creature::UpdateMoveInLineOfSightState().

◆ GetCreatureTypeMask()

uint32 Unit::GetCreatureTypeMask ( ) const
inline
781 {
782 uint32 creatureType = GetCreatureType();
783 return (creatureType >= 1) ? (1 << (creatureType - 1)) : 0;
784 }
uint32 GetCreatureType() const
Definition: Unit.cpp:15283

References GetCreatureType().

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), SpellInfo::CheckTargetCreatureType(), MeleeDamageBonusDone(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ GetCritterGUID()

ObjectGuid Unit::GetCritterGUID ( ) const
inline

◆ GetCurrentSpell() [1/2]

◆ GetCurrentSpell() [2/2]

Spell * Unit::GetCurrentSpell ( uint32  spellType) const
inline
1498{ return m_currentSpells[spellType]; }

References m_currentSpells.

◆ GetCurrentSpellCastTime()

int32 Unit::GetCurrentSpellCastTime ( uint32  spell_id) const
4218{
4219 if (Spell const* spell = FindCurrentSpellBySpellId(spell_id))
4220 return spell->GetCastTime();
4221 return 0;
4222}
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition: Unit.cpp:4209

References FindCurrentSpellBySpellId().

Referenced by CasterAI::JustEngagedWith(), CasterAI::UpdateAI(), and boss_mandokir::boss_mandokirAI::UpdateAI().

◆ getDeathState()

◆ GetDebugInfo()

std::string Unit::GetDebugInfo ( ) const
overridevirtual

Reimplemented from WorldObject.

21197{
21198 std::stringstream sstr;
21199 sstr << WorldObject::GetDebugInfo() << "\n"
21200 << std::boolalpha
21201 << "AliveState: " << IsAlive()
21202 << " UnitMovementFlags: " << GetUnitMovementFlags() << " ExtraUnitMovementFlags: " << GetExtraUnitMovementFlags()
21203 << " Class: " << std::to_string(getClass());
21204 return sstr.str();
21205}
std::string GetDebugInfo() const override
Definition: Object.cpp:2463

References getClass(), WorldObject::GetDebugInfo(), GetExtraUnitMovementFlags(), GetUnitMovementFlags(), and IsAlive().

Referenced by UnitAI::GetDebugInfo(), Creature::GetDebugInfo(), and Player::GetDebugInfo().

◆ GetDefaultMovementType()

MovementGeneratorType Unit::GetDefaultMovementType ( ) const
virtual

-------—End of Pet responses methods-------—

Reimplemented in Creature.

16729{
16730 return IDLE_MOTION_TYPE;
16731}
@ IDLE_MOTION_TYPE
Definition: MotionMaster.h:39

References IDLE_MOTION_TYPE.

◆ GetDefenseSkillValue()

uint32 Unit::GetDefenseSkillValue ( Unit const *  target = nullptr) const
3660{
3661 if (IsPlayer())
3662 {
3663 // in PvP use full skill instead current skill value
3664 uint32 value = (target && target->IsPlayer())
3667 value += uint32(ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));
3668 return value;
3669 }
3670 else
3671 return GetUnitMeleeSkill(target);
3672}
@ CR_DEFENSE_SKILL
Definition: Unit.h:219
@ SKILL_DEFENSE
Definition: SharedDefines.h:3131
uint16 GetSkillValue(uint32 skill) const
Definition: Player.cpp:5486
uint16 GetMaxSkillValue(uint32 skill) const
Definition: Player.cpp:5503

References CR_DEFENSE_SKILL, Player::GetMaxSkillValue(), Player::GetSkillValue(), GetUnitMeleeSkill(), Object::IsPlayer(), SKILL_DEFENSE, and Object::ToPlayer().

Referenced by spell_pal_ardent_defender::Absorb(), DealMeleeDamage(), GetUnitCriticalChance(), RollMeleeOutcomeAgainst(), SpellTakenCritChance(), Player::UpdateBlockPercentage(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetDiminishing()

DiminishingLevels Unit::GetDiminishing ( DiminishingGroup  group)
15109{
15110 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15111 {
15112 if (i->DRGroup != group)
15113 continue;
15114
15115 if (!i->hitCount)
15116 return DIMINISHING_LEVEL_1;
15117
15118 if (!i->hitTime)
15119 return DIMINISHING_LEVEL_1;
15120
15121 // If last spell was casted more than 15 seconds ago - reset the count.
15122 if (i->stack == 0 && getMSTimeDiff(i->hitTime, GameTime::GetGameTimeMS().count()) > 15000)
15123 {
15124 i->hitCount = DIMINISHING_LEVEL_1;
15125 return DIMINISHING_LEVEL_1;
15126 }
15127 // or else increase the count.
15128 else
15129 return DiminishingLevels(i->hitCount);
15130 }
15131 return DIMINISHING_LEVEL_1;
15132}
uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
Definition: Timer.h:110

References DIMINISHING_LEVEL_1, GameTime::GetGameTimeMS(), getMSTimeDiff(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ GetDirectTransport()

TransportBase * Unit::GetDirectTransport ( ) const

◆ GetDiseasesByCaster()

uint32 Unit::GetDiseasesByCaster ( ObjectGuid  casterGUID,
uint8  mode = 0 
)
5910{
5911 static const AuraType diseaseAuraTypes[] =
5912 {
5913 SPELL_AURA_PERIODIC_DAMAGE, // Frost Fever and Blood Plague
5914 SPELL_AURA_LINKED, // Crypt Fever and Ebon Plague
5916 };
5917
5918 ObjectGuid drwGUID;
5919
5920 if (Player* playerCaster = ObjectAccessor::GetPlayer(*this, casterGUID))
5921 drwGUID = playerCaster->getRuneWeaponGUID();
5922
5923 uint32 diseases = 0;
5924 for (uint8 index = 0; diseaseAuraTypes[index] != SPELL_AURA_NONE; ++index)
5925 {
5926 for (AuraEffectList::iterator i = m_modAuras[diseaseAuraTypes[index]].begin(); i != m_modAuras[diseaseAuraTypes[index]].end();)
5927 {
5928 // Get auras with disease dispel type by caster
5929 if ((*i)->GetSpellInfo()->Dispel == DISPEL_DISEASE
5930 && ((*i)->GetCasterGUID() == casterGUID || (*i)->GetCasterGUID() == drwGUID)) // if its caster or his dancing rune weapon
5931 {
5932 ++diseases;
5933
5934 if (mode == 1)
5935 {
5936 RemoveAura((*i)->GetId(), (*i)->GetCasterGUID());
5937 i = m_modAuras[diseaseAuraTypes[index]].begin();
5938 continue;
5939 }
5940 // used for glyph of scourge strike
5941 else if (mode == 2)
5942 {
5943 Aura* aura = (*i)->GetBase();
5944 uint32 countMin = aura->GetMaxDuration();
5945 uint32 countMax = aura->GetSpellInfo()->GetMaxDuration() + 9000;
5946
5947 if (AuraEffect const* epidemic = (*i)->GetCaster()->GetAuraEffectOfRankedSpell(49036, EFFECT_0))
5948 countMax += epidemic->GetAmount();
5949
5950 if (countMin < countMax)
5951 {
5952 aura->SetDuration(uint32(aura->GetDuration() + 3000));
5953 aura->SetMaxDuration(countMin + 3000);
5954 }
5955 }
5956 }
5957 ++i;
5958 }
5959 }
5960 return diseases;
5961}
AuraType
Definition: SpellAuraDefines.h:62
@ SPELL_AURA_LINKED
Definition: SpellAuraDefines.h:347
@ SPELL_AURA_NONE
Definition: SpellAuraDefines.h:63
@ EFFECT_0
Definition: SharedDefines.h:31
@ DISPEL_DISEASE
Definition: SharedDefines.h:1386
AuraEffect * GetAuraEffectOfRankedSpell(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition: Unit.cpp:5573
int32 GetMaxDuration() const
Definition: SpellAuras.h:129
void SetMaxDuration(int32 duration)
Definition: SpellAuras.h:130
int32 GetMaxDuration() const
Definition: SpellInfo.cpp:2357

References DISPEL_DISEASE, EFFECT_0, GetAuraEffectOfRankedSpell(), AuraEffect::GetCaster(), Aura::GetDuration(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), ObjectAccessor::GetPlayer(), Aura::GetSpellInfo(), m_modAuras, RemoveAura(), Aura::SetDuration(), Aura::SetMaxDuration(), SPELL_AURA_LINKED, SPELL_AURA_NONE, and SPELL_AURA_PERIODIC_DAMAGE.

Referenced by Spell::EffectWeaponDmg(), MeleeDamageBonusDone(), and SpellPctDamageModsDone().

◆ GetDispellableAuraList()

void Unit::GetDispellableAuraList ( Unit caster,
uint32  dispelMask,
DispelChargesList dispelList,
SpellInfo const *  dispelSpell 
)
5671{
5672 // we should not be able to dispel diseases if the target is affected by unholy blight
5673 if (dispelMask & (1 << DISPEL_DISEASE) && HasAura(50536))
5674 dispelMask &= ~(1 << DISPEL_DISEASE);
5675
5676 ReputationRank rank = GetReactionTo(caster, IsCharmed());
5677 bool positive = rank >= REP_FRIENDLY;
5678
5679 // Neutral unit not at war with caster should be treated as a friendly unit
5680 if (rank == REP_NEUTRAL)
5681 {
5682 if (Player* casterPlayer = caster->GetAffectingPlayer())
5683 {
5684 if (FactionTemplateEntry const* factionTemplateEntry = GetFactionTemplateEntry())
5685 {
5686 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
5687 {
5688 if (factionEntry->CanBeSetAtWar())
5689 {
5690 positive = !casterPlayer->GetReputationMgr().IsAtWar(factionEntry);
5691 }
5692 }
5693 }
5694 }
5695 }
5696
5697 Unit::VisibleAuraMap const* visibleAuras = GetVisibleAuras();
5698 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
5699 {
5700 Aura* aura = itr->second->GetBase();
5701
5702 // don't try to remove passive auras
5703 if (aura->IsPassive())
5704 continue;
5705
5706 if (aura->GetSpellInfo()->GetDispelMask() & dispelMask)
5707 {
5708 if (aura->GetSpellInfo()->Dispel == DISPEL_MAGIC)
5709 {
5710 // do not remove positive auras if friendly target
5711 // negative auras if non-friendly target
5712 if (itr->second->IsPositive() == positive)
5713 continue;
5714 }
5715
5716 // Banish should only be dispelled by Mass Dispel
5717 if (aura->GetSpellInfo()->Mechanic == MECHANIC_BANISH && !dispelSpell->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
5718 {
5719 continue;
5720 }
5721
5722 // The charges / stack amounts don't count towards the total number of auras that can be dispelled.
5723 // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell
5724 // Polymorph instead of 1 / (5 + 1) -> 16%.
5725 bool dispel_charges = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_REMOVES_CHARGES);
5726 uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount();
5727 if (charges > 0)
5728 dispelList.push_back(std::make_pair(aura, charges));
5729 }
5730 }
5731}
@ SPELL_ATTR7_DISPEL_REMOVES_CHARGES
Definition: SharedDefines.h:662
@ MECHANIC_BANISH
Definition: SharedDefines.h:1354
@ SPELL_ATTR0_NO_IMMUNITIES
Definition: SharedDefines.h:422
@ REP_FRIENDLY
Definition: SharedDefines.h:184
@ DISPEL_MAGIC
Definition: SharedDefines.h:1384
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5786
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition: Unit.h:642
VisibleAuraMap const * GetVisibleAuras()
Definition: Unit.h:1460
uint8 GetStackAmount() const
Definition: SpellAuras.h:148
uint8 GetCharges() const
Definition: SpellAuras.h:141
bool IsPassive() const
Definition: SpellAuras.cpp:1082
uint32 Mechanic
Definition: SpellInfo.h:323
uint32 Dispel
Definition: SpellInfo.h:322

References SpellInfo::Dispel, DISPEL_DISEASE, DISPEL_MAGIC, GetAffectingPlayer(), Aura::GetCharges(), SpellInfo::GetDispelMask(), GetFactionTemplateEntry(), GetReactionTo(), Aura::GetSpellInfo(), Aura::GetStackAmount(), GetVisibleAuras(), SpellInfo::HasAttribute(), HasAura(), IsCharmed(), Aura::IsPassive(), SpellInfo::Mechanic, MECHANIC_BANISH, REP_FRIENDLY, REP_NEUTRAL, sFactionStore, SPELL_ATTR0_NO_IMMUNITIES, and SPELL_ATTR7_DISPEL_REMOVES_CHARGES.

Referenced by Spell::EffectDispel().

◆ GetDisplayId()

◆ GetDisplayRace()

DisplayRace Unit::GetDisplayRace ( ) const
inline
DisplayRace GetDisplayRaceFromModelId(uint32 modelId) const
Definition: Unit.cpp:20885
uint32 GetDisplayId() const
Definition: Unit.h:1890

References GetDisplayId(), and GetDisplayRaceFromModelId().

Referenced by AuraEffect::HandleAuraTransform().

◆ GetDisplayRaceFromModelId()

DisplayRace Unit::GetDisplayRaceFromModelId ( uint32  modelId) const
20886{
20887 if (CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(modelId))
20888 {
20889 if (CreatureDisplayInfoExtraEntry const* displayExtra = sCreatureDisplayInfoExtraStore.LookupEntry(display->ExtendedDisplayInfoID))
20890 {
20891 return DisplayRace(displayExtra->DisplayRaceID);
20892 }
20893 }
20894 return DisplayRace::None;
20895}
DBCStorage< CreatureDisplayInfoExtraEntry > sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt)
DisplayRace
Definition: SharedDefines.h:111
Definition: DBCStructure.h:739

References sCreatureDisplayInfoExtraStore, and sCreatureDisplayInfoStore.

Referenced by GetDisplayRace().

◆ GetDoTsByCaster()

uint32 Unit::GetDoTsByCaster ( ObjectGuid  casterGUID) const
5964{
5965 static const AuraType diseaseAuraTypes[] =
5966 {
5970 };
5971
5972 uint32 dots = 0;
5973 for (AuraType const* itr = &diseaseAuraTypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
5974 {
5975 Unit::AuraEffectList const& auras = GetAuraEffectsByType(*itr);
5976 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5977 {
5978 // Get auras by caster
5979 if ((*i)->GetCasterGUID() == casterGUID)
5980 ++dots;
5981 }
5982 }
5983 return dots;
5984}
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
Definition: SpellAuraDefines.h:152

References GetAuraEffectsByType(), SPELL_AURA_NONE, SPELL_AURA_PERIODIC_DAMAGE, and SPELL_AURA_PERIODIC_DAMAGE_PERCENT.

Referenced by SpellPctDamageModsDone().

◆ GetDummyAuraEffect()

◆ GetDynamicFlags()

◆ GetDynObject()

DynamicObject * Unit::GetDynObject ( uint32  spellId)
6225{
6226 if (m_dynObj.empty())
6227 return nullptr;
6228 for (DynObjectList::const_iterator i = m_dynObj.begin(); i != m_dynObj.end(); ++i)
6229 {
6230 DynamicObject* dynObj = *i;
6231 if (dynObj->GetSpellId() == spellId)
6232 return dynObj;
6233 }
6234 return nullptr;
6235}
Definition: DynamicObject.h:35
uint32 GetSpellId() const
Definition: DynamicObject.h:58

References DynamicObject::GetSpellId(), and m_dynObj.

Referenced by Spell::DelayedChannel(), WorldSession::HandleFarSightOpcode(), and boss_akilzon::JustEngagedWith().

◆ GetEffectiveResistChance()

float Unit::GetEffectiveResistChance ( Unit const *  owner,
SpellSchoolMask  schoolMask,
Unit const *  victim 
)
static
2146{
2147 float victimResistance = float(victim->GetResistance(schoolMask));
2148 if (owner)
2149 {
2150 // Xinef: pets inherit 100% of masters penetration
2151 // Xinef: excluding traps
2152 Player const* player = owner->GetSpellModOwner();
2153 if (player && owner->GetEntry() != WORLD_TRIGGER)
2154 {
2155 victimResistance += float(player->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2156 victimResistance -= float(player->GetSpellPenetrationItemMod());
2157 }
2158 else
2159 victimResistance += float(owner->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2160 }
2161
2162 victimResistance = std::max(victimResistance, 0.0f);
2163 if (owner)
2164 victimResistance += std::max((float(victim->GetLevel()) - float(owner->GetLevel())) * 5.0f, 0.0f);
2165
2166 static uint32 const BOSS_LEVEL = 83;
2167 static float const BOSS_RESISTANCE_CONSTANT = 510.0f;
2168 uint32 level = victim->GetLevel();
2169 float resistanceConstant = 0.0f;
2170
2171 if (level == BOSS_LEVEL)
2172 resistanceConstant = BOSS_RESISTANCE_CONSTANT;
2173 else
2174 resistanceConstant = level * 5.0f;
2175
2176 return victimResistance / (victimResistance + resistanceConstant);
2177}
int32 GetSpellPenetrationItemMod() const
Definition: Player.h:1971

References Object::GetEntry(), GetLevel(), GetResistance(), GetSpellModOwner(), Player::GetSpellPenetrationItemMod(), GetTotalAuraModifierByMiscMask(), SPELL_AURA_MOD_TARGET_RESISTANCE, and WORLD_TRIGGER.

Referenced by CalcAbsorbResist(), and MagicSpellHitResult().

◆ GetExtraUnitMovementFlags()

uint16 Unit::GetExtraUnitMovementFlags ( ) const
inline

◆ GetFaction()

uint32 Unit::GetFaction ( ) const
inline

References Object::GetUInt32Value(), and UNIT_FIELD_FACTIONTEMPLATE.

Referenced by npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::AttackStart(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::AttackStart(), Creature::CanAssistTo(), spell_q10985_light_of_the_naaru::CheckProc(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), Spell::EffectDuel(), Spell::EffectSummonType(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::EnterEvadeMode(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::EnterEvadeMode(), npc_chesspiece::GetDefaultOrientationForTeam(), GetFactionTemplateEntry(), GetReactionTo(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleGossipHelloOpcode(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcGuidCommand(), npc_commandscript::HandleNpcInfoCommand(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandlePlayerLoginFromDB(), TempSummon::InitStats(), InitTamedPet(), IsFriendly(), IsInPartyWith(), IsInRaidWith(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), npc_escortAI::JustRespawned(), FollowerAI::JustRespawned(), SmartAI::JustRespawned(), boss_volkhan::boss_volkhanAI::JustSummoned(), Pet::LoadPetFromDB(), npc_chesspiece::npc_chesspiece(), npc_plucky::npc_pluckyAI::npc_pluckyAI(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::npc_taskmaster_fizzuleAI(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), npc_eris_hevenfire::OnQuestAccept(), npc_cork_gizelton::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), PatchValuesUpdate(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_future_you::npc_future_youAI::Reset(), WorldSession::SendAuctionHello(), SetCharmedBy(), Player::SetGameMaster(), npc_chesspiece::sGossipHello(), boss_malchezaar::SpawnInfernal(), Spell::SummonGuardian(), Player::SummonPet(), npc_chesspiece::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), and Creature::UpdateMoveInLineOfSightState().

◆ GetFactionReactionTo()

ReputationRank Unit::GetFactionReactionTo ( FactionTemplateEntry const *  factionTemplateEntry,
Unit const *  target 
) const
10255{
10256 // always neutral when no template entry found
10257 if (!factionTemplateEntry)
10258 return REP_NEUTRAL;
10259
10260 FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry();
10261 if (!targetFactionTemplateEntry)
10262 return REP_NEUTRAL;
10263
10264 // xinef: check forced reputation for self also
10265 if (Player const* selfPlayerOwner = GetAffectingPlayer())
10266 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(target->GetFactionTemplateEntry()))
10267 return *repRank;
10268
10269 if (Player const* targetPlayerOwner = target->GetAffectingPlayer())
10270 {
10271 // check contested flags
10272 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10273 && targetPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10274 return REP_HOSTILE;
10275 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(factionTemplateEntry))
10276 return *repRank;
10277 if (!target->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10278 {
10279 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
10280 {
10281 if (factionEntry->CanHaveReputation())
10282 {
10283 // CvP case - check reputation, don't allow state higher than neutral when at war
10284 ReputationRank repRank = targetPlayerOwner->GetReputationMgr().GetRank(factionEntry);
10285 if (targetPlayerOwner->GetReputationMgr().IsAtWar(factionEntry))
10286 repRank = std::min(REP_NEUTRAL, repRank);
10287 return repRank;
10288 }
10289 }
10290 }
10291 }
10292
10293 // common faction based check
10294 if (factionTemplateEntry->IsHostileTo(*targetFactionTemplateEntry))
10295 return REP_HOSTILE;
10296 if (factionTemplateEntry->IsFriendlyTo(*targetFactionTemplateEntry))
10297 return REP_FRIENDLY;
10298 if (targetFactionTemplateEntry->IsFriendlyTo(*factionTemplateEntry))
10299 return REP_FRIENDLY;
10300 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS)
10301 return REP_HOSTILE;
10302 // neutral by default
10303 return REP_NEUTRAL;
10304}
@ UNIT_FLAG2_IGNORE_REPUTATION
Definition: UnitDefines.h:293
@ PLAYER_FLAGS_CONTESTED_PVP
Definition: Player.h:477
@ FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS
Definition: DBCEnums.h:332
@ FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
Definition: DBCEnums.h:331
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition: DBCStructure.h:951

References FactionTemplateEntry::faction, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS, FactionTemplateEntry::factionFlags, GetAffectingPlayer(), GetFactionTemplateEntry(), HasUnitFlag2(), FactionTemplateEntry::IsFriendlyTo(), FactionTemplateEntry::IsHostileTo(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HOSTILE, REP_NEUTRAL, sFactionStore, and UNIT_FLAG2_IGNORE_REPUTATION.

Referenced by GetReactionTo().

◆ GetFactionTemplateEntry()

FactionTemplateEntry const * Unit::GetFactionTemplateEntry ( ) const
10105{
10106 FactionTemplateEntry const* entry = sFactionTemplateStore.LookupEntry(GetFaction());
10107 if (!entry)
10108 {
10109 static ObjectGuid guid; // prevent repeating spam same faction problem
10110
10111 if (GetGUID() != guid)
10112 {
10113 if (Player const* player = ToPlayer())
10114 LOG_ERROR("entities.unit", "Player {} has invalid faction (faction template id) #{}", player->GetName(), GetFaction());
10115 else if (Creature const* creature = ToCreature())
10116 LOG_ERROR("entities.unit", "Creature (template id: {}) has invalid faction (faction template id) #{}", creature->GetCreatureTemplate()->Entry, GetFaction());
10117 else
10118 LOG_ERROR("entities.unit", "Unit (name={}, type={}) has invalid faction (faction template id) #{}", GetName(), uint32(GetTypeId()), GetFaction());
10119
10120 guid = GetGUID();
10121 }
10122 }
10123 return entry;
10124}
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
TypeID GetTypeId() const
Definition: Object.h:128
std::string const & GetName() const
Definition: Object.h:525
uint32 GetFaction() const
Definition: Unit.h:803

References GetFaction(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), LOG_ERROR, sFactionTemplateStore, Object::ToCreature(), and Object::ToPlayer().

Referenced by _IsValidAttackTarget(), Player::CanUseBattlegroundObject(), npc_necrotic_shard::DamageTaken(), HostileRefMgr::deleteReferencesForFaction(), Spell::EffectGameObjectDamage(), GetDispellableAuraList(), GetFactionReactionTo(), GetReactionTo(), Player::GetReputationPriceDiscount(), IsContestedGuard(), IsHostileToPlayers(), IsNeutralToAll(), npc_chesspiece::OnCharmed(), PatchValuesUpdate(), and RespondsToCallForHelp().

◆ GetFirstControlled()

Unit * Unit::GetFirstControlled ( ) const
11171{
11172 // Sequence: charmed, pet, other guardians
11173 Unit* unit = GetCharm();
11174 if (!unit)
11175 if (ObjectGuid guid = GetMinionGUID())
11176 unit = ObjectAccessor::GetUnit(*this, guid);
11177
11178 return unit;
11179}
ObjectGuid GetMinionGUID() const
Definition: Unit.h:672

References GetCharm(), GetMinionGUID(), and ObjectAccessor::GetUnit().

Referenced by Player::CharmSpellInitialize(), CombatStart(), WorldSession::HandlePetSetAction(), and RemoveCharmedBy().

◆ GetFirstCurrentCastingSpell()

Spell * Unit::GetFirstCurrentCastingSpell ( ) const
4201{
4202 for (uint32 i = 0; i < CURRENT_MAX_SPELL; i++)
4203 if (m_currentSpells[i] && m_currentSpells[i]->GetCastTimeRemaining() > 0)
4204 return m_currentSpells[i];
4205
4206 return nullptr;
4207}

References CURRENT_MAX_SPELL, and m_currentSpells.

Referenced by ChaseMovementGenerator< T >::DoUpdate().

◆ GetFirstMinion()

Minion * Unit::GetFirstMinion ( ) const
10732{
10733 if (ObjectGuid pet_guid = GetMinionGUID())
10734 {
10735 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10736 if (pet->HasUnitTypeMask(UNIT_MASK_MINION))
10737 return (Minion*)pet;
10738
10739 LOG_ERROR("entities.unit", "Unit::GetFirstMinion: Minion {} not exist.", pet_guid.ToString());
10740 const_cast<Unit*>(this)->SetMinionGUID(ObjectGuid::Empty);
10741 }
10742
10743 return nullptr;
10744}
Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const)
Definition: ObjectAccessor.cpp:234
void SetMinionGUID(ObjectGuid guid)
Definition: Unit.h:673

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetMinionGUID(), LOG_ERROR, SetMinionGUID(), and UNIT_MASK_MINION.

◆ GetFollowAngle()

◆ GetGameObject()

GameObject * Unit::GetGameObject ( uint32  spellId) const
6266{
6267 for (GameObjectList::const_iterator itr = m_gameObj.begin(); itr != m_gameObj.end(); ++itr)
6268 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6269 if (go->GetSpellId() == spellId)
6270 return go;
6271
6272 return nullptr;
6273}

References ObjectAccessor::GetGameObject(), and m_gameObj.

Referenced by Player::GetGameObjectIfCanInteractWith(), and Player::TeleportTo().

◆ getGender()

◆ GetGuardianPet()

Guardian * Unit::GetGuardianPet ( ) const
10747{
10748 if (ObjectGuid pet_guid = GetPetGUID())
10749 {
10750 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10751 if (pet->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10752 return (Guardian*)pet;
10753
10754 LOG_FATAL("entities.unit", "Unit::GetGuardianPet: Guardian {} not exist.", pet_guid.ToString());
10755 const_cast<Unit*>(this)->SetPetGUID(ObjectGuid::Empty);
10756 }
10757
10758 return nullptr;
10759}
#define LOG_FATAL(filterType__,...)
Definition: Log.h:154
Definition: TemporarySummon.h:96
void SetPetGUID(ObjectGuid guid)
Definition: Unit.h:677
ObjectGuid GetPetGUID() const
Definition: Unit.h:678

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetPetGUID(), LOG_FATAL, SetPetGUID(), and UNIT_MASK_GUARDIAN.

Referenced by spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Spell::EffectSummonPet(), GetNextRandomRaidMemberOrPet(), AuraEffect::HandleAuraDummy(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), AuraEffect::HandleModDamageDone(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), Spell::SelectImplicitCasterObjectTargets(), and SetMinion().

◆ GetHealth()

uint32 Unit::GetHealth ( ) const
inline
@ UNIT_FIELD_HEALTH
Definition: UpdateFields.h:96

References Object::GetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_SaveCharacter(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), Spell::CheckPower(), CountPctFromCurHealth(), ScriptedAI::DamageTaken(), boss_eregos::boss_eregosAI::DamageTaken(), boss_razorgore::boss_razorgoreAI::DamageTaken(), boss_majordomo::boss_majordomoAI::DamageTaken(), boss_ragnaros::boss_ragnarosAI::DamageTaken(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_julianne::DamageTaken(), boss_romulo::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_muru::DamageTaken(), npc_dark_fiend::DamageTaken(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_announcer_toc5::npc_announcer_toc5AI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_ick::boss_ickAI::DamageTaken(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::DamageTaken(), boss_drakkari_colossus::boss_drakkari_colossusAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_akama_illidan::DamageTaken(), npc_maiev_illidan::DamageTaken(), boss_illidari_council::DamageTaken(), boss_illidari_council_memberAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_the_lurker_below::DamageTaken(), npc_shattered_hand_scout::DamageTaken(), boss_alar::DamageTaken(), advisor_baseAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_hor_leader_second::npc_hor_leader_secondAI::DamageTaken(), npc_ice_tomb::npc_ice_tombAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_nightbane::DamageTaken(), boss_thekal::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), boss_illidan_stormrage::DamageTaken(), npc_garr_firesworn::npc_garr_fireswornAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), SmartAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kologarn::boss_kologarnAI::DamageTaken(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), DealMeleeDamage(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectHealMaxHealth(), Spell::EffectInstaKill(), Pet::FillPetInfo(), boss_supremus::FindHatefulStrikeTarget(), GetHealthGain(), GetHealthPct(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_rajaxx_thundercrash::HandleDamageCalc(), misc_commandscript::HandleDieCommand(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), npc_commandscript::HandleNpcInfoCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), IsFullHealth(), npc_dirt_mound::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), Kill(), ModifyHealth(), spell_xt002_gravity_bomb_aura::OnPeriodic(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::ResetPlayerDamageReq(), Player::SaveHealthBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), SendAttackStateUpdate(), SendSpellNonMeleeDamageLog(), SendSpellNonMeleeReflectLog(), SetMaxHealth(), boss_eadric::boss_eadricAI::SpellHit(), boss_headless_horseman_head::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), boss_ouro::Submerge(), Aura::Update(), boss_headless_horseman::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), Player::UpdateCharmedAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ GetHealthGain()

int32 Unit::GetHealthGain ( int32  dVal)
14225{
14226 int32 gain = 0;
14227
14228 if (dVal == 0)
14229 return 0;
14230
14231 int32 curHealth = (int32)GetHealth();
14232
14233 int32 val = dVal + curHealth;
14234 if (val <= 0)
14235 {
14236 return -curHealth;
14237 }
14238
14239 int32 maxHealth = (int32)GetMaxHealth();
14240
14241 if (val < maxHealth)
14242 gain = dVal;
14243 else if (curHealth != maxHealth)
14244 gain = maxHealth - curHealth;
14245
14246 return gain;
14247}

References GetHealth(), and GetMaxHealth().

Referenced by Spell::DoAllEffectOnTarget().

◆ GetHealthPct()

◆ getHostileRefMgr()

◆ GetHoverHeight()

float Unit::GetHoverHeight ( ) const
inline
1633{ return IsHovering() ? GetFloatValue(UNIT_FIELD_HOVERHEIGHT) : 0.0f; }
@ UNIT_FIELD_HOVERHEIGHT
Definition: UpdateFields.h:173
bool IsHovering() const
Definition: Unit.h:1627

References Object::GetFloatValue(), IsHovering(), and UNIT_FIELD_HOVERHEIGHT.

Referenced by Map::CheckCollisionAndGetValidCoords(), Creature::Create(), GetChaseRange(), WorldSession::HandleMoveWorldportAck(), and MotionMaster::MoveFall().

◆ GetInterruptMask()

uint32 Unit::GetInterruptMask ( ) const
inline
1524{ return m_interruptMask; }

References m_interruptMask.

◆ GetLastDamagedTargetGuid()

ObjectGuid const & Unit::GetLastDamagedTargetGuid ( ) const
inline
914{ return _lastDamagedTargetGuid; }

References _lastDamagedTargetGuid.

◆ GetLastExtraAttackSpell()

uint32 Unit::GetLastExtraAttackSpell ( ) const
inline
951{ return _lastExtraAttackSpell; }

References _lastExtraAttackSpell.

Referenced by HandleProcTriggerSpell().

◆ GetLevel()

uint8 Unit::GetLevel ( ) const
inline
@ UNIT_FIELD_LEVEL
Definition: UpdateFields.h:114

References Object::GetUInt32Value(), and UNIT_FIELD_LEVEL.

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDamage(), KillRewarder::_InitGroupData(), Pet::_LoadAuras(), KillRewarder::_RewardPlayer(), KillRewarder::_RewardXP(), Player::_SaveCharacter(), Player::_SaveStats(), spell_pal_ardent_defender::Absorb(), Pet::addSpell(), Spell::AddUnitTarget(), Player::ApplyEnchantment(), AuraEffect::AuraEffect(), BattlegroundMgr::BuildBattlegroundListPacket(), WorldSession::BuildPartyMemberStatsChangedPacket(), CalcArmorReducedDamage(), SpellInfo::CalcPowerCost(), SpellEffectInfo::CalcRadius(), spell_gen_disabled_above_63::CalculateAmount(), spell_item_arcane_shroud::CalculateAmount(), spell_item_the_eye_of_diminution::CalculateAmount(), AuraEffect::CalculateAmount(), CalculateLevelPenalty(), CalculateMeleeDamage(), Player::CalculateMinMaxDamage(), Player::CalculateQuestRewardXP(), Player::CalculateReputationGain(), Player::CalculateTalentsPoints(), SpellEffectInfo::CalcValue(), Player::CanEquipItem(), Group::CanJoinBattlegroundQueue(), Player::CanSeeStartQuest(), Player::CanUseItem(), Player::CheckAreaExploreAndOutdoor(), spell_hun_tame_beast::CheckCast(), Spell::CheckCast(), ServerMailCondition::CheckCondition(), Spell::CheckEffectTarget(), spell_gen_proc_above_75::CheckLevel(), spell_gen_proc_reduced_above_60::CheckProc(), spell_item_green_whelp_armor::CheckProc(), Pet::CreateBaseAtTamed(), Player::CreatePet(), CreateTamedPetFrom(), DealMeleeDamage(), DoLowUnlearnCost(), DoMedUnlearnCost(), Spell::DoSpellHitOnUnit(), Spell::EffectAddHonor(), Spell::EffectApplyGlyph(), Spell::EffectDuel(), Spell::EffectEnergize(), Spell::EffectSchoolDMG(), Spell::EffectSkinning(), Spell::EffectTameCreature(), Pet::FillPetInfo(), lfg::LFGMgr::FinishDungeon(), Acore::XP::Gain(), Player::GetAverageItemLevel(), Player::GetAverageItemLevelForDF(), Player::GetBarberShopCost(), Player::GetBGAccessByLevel(), Pet::GetCurrentFoodBenefitLevel(), npc_wg_quest_giver::GetDialogStatus(), Player::GetDodgeFromAgility(), GetEffectiveResistChance(), SocialMgr::GetFriendInfo(), getLevelForTarget(), Creature::getLevelForTarget(), GetMaxSkillValueForLevel(), Player::GetMeleeCritFromAgility(), Pet::GetNativeObjectScale(), Player::GetQuestDialogStatus(), Player::GetQuestLevel(), Player::GetRatingMultiplier(), Creature::GetShieldBlockValue(), Player::GetSpellCritFromIntellect(), Player::GetsRecruitAFriendBonus(), Player::GetTrainerSpellState(), GetUnitMeleeSkill(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), WorldSession::HandleAcceptGrantLevel(), OutdoorPvPSI::HandleAreaTrigger(), WorldSession::HandleArenaTeamInviteOpcode(), WorldSession::HandleAuctionListItems(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlefieldStatusOpcode(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), WorldSession::HandleCastSpellOpcode(), Player::HandleDrowning(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLfgPlayerLockInfoRequestOpcode(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), WorldSession::HandleMessagechatOpcode(), npc_commandscript::HandleNpcInfoCommand(), WorldSession::HandleOfferPetitionOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandlePetitionSignOpcode(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), spell_pri_divine_aegis::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), reset_commandscript::HandleResetLevelCommand(), spell_wintergrasp_portal::HandleScript(), spell_item_scroll_of_recall::HandleScript(), WorldSession::HandleSendMail(), player_settings_commandscript::HandleSettingsAnnouncerFlags(), Player::InitGlyphsForLevel(), lfg::LFGMgr::InitializeLockedDungeons(), Pet::InitLevelupSpellsForLevel(), Puppet::InitStats(), TempSummon::InitStats(), Player::InitStatsForLevel(), Pet::InitTalentForLevel(), Player::InitTaxiNodesForLevel(), Battlefield::InvitePlayerToWar(), Creature::isCanTrainingAndResetTalentsOf(), Player::isHonorOrXPTarget(), Player::IsMaxLevel(), Player::LearnDefaultSkill(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), AchievementCriteriaData::Meets(), MeleeSpellHitResult(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), spell_item_with_mount_speed::OnApply(), item_generic_limit_chance_above_60::OnCastItemCombatSpell(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), Player::OnGossipSelect(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), Player::PrepareGossipMenu(), Player::Regenerate(), Player::RegenerateHealth(), Player::RemovedInsignia(), Pet::removeSpell(), Pet::resetTalents(), Player::ResurrectPlayer(), Player::RewardHonor(), Player::RewardQuest(), RewardRage(), Player::RewardReputation(), RollMeleeOutcomeAgainst(), ArenaTeam::Roster(), Player::Satisfy(), Player::SatisfyQuestLevel(), Pet::SavePetToDB(), CalendarMgr::SendCalendarEvent(), CalendarMgr::SendCalendarEventInvite(), WorldSession::SendLfgPlayerReward(), WorldSession::SendLfgRoleCheckUpdate(), Player::SendLoot(), PlayerMenu::SendQuestGiverOfferReward(), PlayerMenu::SendQuestGiverQuestDetails(), PlayerMenu::SendQuestQueryResponse(), Player::SendQuestReward(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), Player::SetRestBonus(), Guild::Member::SetStats(), SpellPctDamageModsDone(), Spell::SummonGuardian(), Player::SummonPet(), Pet::SynchronizeLevelWithOwner(), Aura::Update(), npc_pet_hunter_snake_trap::UpdateAI(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCombatSkills(), Creature::UpdateEntry(), lfg::LFGMgr::UpdateRaidBrowser(), and GameObject::Use().

◆ getLevelForTarget()

◆ GetMagicHitRedirectTarget()

Unit * Unit::GetMagicHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo 
)
11115{
11116 // Patch 1.2 notes: Spell Reflection no longer reflects abilities
11117 if (spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR1_NO_REDIRECTION) || spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
11118 return victim;
11119
11121 for (Unit::AuraEffectList::const_iterator itr = magnetAuras.begin(); itr != magnetAuras.end(); ++itr)
11122 {
11123 if (Unit* magnet = (*itr)->GetBase()->GetUnitOwner())
11124 if (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11125 //&& spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK
11126 && _IsValidAttackTarget(magnet, spellInfo)
11127 /*&& IsWithinLOSInMap(magnet)*/)
11128 {
11129 // Xinef: We should choose minimum between flight time and queue time as in reflect, however we dont know flight time at this point, use arbitrary small number
11130 magnet->m_Events.AddEvent(new RedirectSpellEvent(*magnet, victim->GetGUID(), *itr), magnet->m_Events.CalculateQueueTime(100));
11131
11132 if (magnet->IsTotem())
11133 {
11134 uint64 queueTime = magnet->m_Events.CalculateQueueTime(100);
11135 if (spellInfo->Speed > 0.0f)
11136 {
11137 float dist = GetDistance(magnet->GetPositionX(), magnet->GetPositionY(), magnet->GetPositionZ());
11138 if (dist < 5.0f)
11139 dist = 5.0f;
11140 queueTime = magnet->m_Events.CalculateTime((uint64)std::floor(dist / spellInfo->Speed * 1000.0f));
11141 }
11142
11143 magnet->m_Events.AddEvent(new KillMagnetEvent(*magnet), queueTime);
11144 }
11145
11146 return magnet;
11147 }
11148 }
11149 return victim;
11150}
@ SPELL_AURA_SPELL_MAGNET
Definition: SpellAuraDefines.h:159
@ SPELL_ATTR1_NO_REDIRECTION
Definition: SharedDefines.h:433
@ SPELL_ATTR0_IS_ABILITY
Definition: SharedDefines.h:397
Definition: TotemAI.h:47
float GetDistance(WorldObject const *obj) const
Definition: Object.cpp:1250
bool _IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
Definition: Unit.cpp:13978
Definition: Unit.h:2239

References _IsValidAttackTarget(), SpellInfo::CheckExplicitTarget(), GetAuraEffectsByType(), WorldObject::GetDistance(), Object::GetGUID(), SpellInfo::HasAttribute(), SpellInfo::Speed, SPELL_ATTR0_IS_ABILITY, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_NO_REDIRECTION, SPELL_AURA_SPELL_MAGNET, and SPELL_CAST_OK.

Referenced by Spell::SelectExplicitTargets().

◆ GetMaxHealth()

uint32 Unit::GetMaxHealth ( ) const
inline
@ UNIT_FIELD_MAXHEALTH
Definition: UpdateFields.h:104

References Object::GetUInt32Value(), and UNIT_FIELD_MAXHEALTH.

Referenced by Player::_SaveStats(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_viscidus::boss_viscidus(), WorldSession::BuildPartyMemberStatsChangedPacket(), spell_item_skull_of_impeding_doom::CalculateDamageAmount(), CountPctFromMaxHealth(), boss_eregos::boss_eregosAI::DamageTaken(), npc_dark_fiend::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_alar::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_twinemperorsAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_heated_battle::npc_heated_battleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectHealMaxHealth(), Spell::EffectSummonPet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), Acore::XP::Gain(), GetHealthGain(), GetHealthPct(), npc_echo_of_medivh::GetPiece(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), HandleAuraProc(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcInfoCommand(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_stinky_precious_decimate::HandleScript(), IsFullHealth(), boss_twin_valkyrAI::JustEngagedWith(), boss_sister_svalna::boss_sister_svalnaAI::JustEngagedWith(), boss_ingvar_the_plunderer::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), Player::outDebugValues(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetFullHealth(), SetHealth(), boss_headless_horseman::SpellHit(), npc_necrotic_shard::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), boss_viscidus::SummonedCreatureDies(), boss_headless_horseman::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxNegativeAuraModifier()

int32 Unit::GetMaxNegativeAuraModifier ( AuraType  auratype) const
6046{
6047 int32 modifier = 0;
6048
6049 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6050 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6051 if ((*i)->GetAmount() < modifier)
6052 modifier = (*i)->GetAmount();
6053
6054 return modifier;
6055}

References GetAuraEffectsByType().

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), SpellHealingBonusTaken(), and UpdateSpeed().

◆ GetMaxNegativeAuraModifierByAffectMask()

int32 Unit::GetMaxNegativeAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6201{
6202 int32 modifier = 0;
6203
6204 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6205 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6206 {
6207 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() < modifier)
6208 modifier = (*i)->GetAmount();
6209 }
6210
6211 return modifier;
6212}

References GetAuraEffectsByType().

◆ GetMaxNegativeAuraModifierByMiscMask()

int32 Unit::GetMaxNegativeAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6097{
6098 int32 modifier = 0;
6099
6100 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6101 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6102 {
6103 if ((*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() < modifier)
6104 modifier = (*i)->GetAmount();
6105 }
6106
6107 return modifier;
6108}

References GetAuraEffectsByType().

Referenced by SpellTakenCritChance().

◆ GetMaxNegativeAuraModifierByMiscValue()

int32 Unit::GetMaxNegativeAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6149{
6150 int32 modifier = 0;
6151
6152 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6153 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6154 {
6155 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() < modifier)
6156 modifier = (*i)->GetAmount();
6157 }
6158
6159 return modifier;
6160}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult(), and ModSpellDuration().

◆ GetMaxPositiveAuraModifier()

int32 Unit::GetMaxPositiveAuraModifier ( AuraType  auratype)
6032{
6033 int32 modifier = 0;
6034
6035 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6036 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6037 {
6038 if ((*i)->GetAmount() > modifier)
6039 modifier = (*i)->GetAmount();
6040 }
6041
6042 return modifier;
6043}

References GetAuraEffectsByType().

Referenced by CalculateSpellAmount(), AuraEffect::HandlePeriodicHealAurasTick(), Player::RewardHonor(), SpellHealingBonusTaken(), and UpdateSpeed().

◆ GetMaxPositiveAuraModifierByAffectMask()

int32 Unit::GetMaxPositiveAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6187{
6188 int32 modifier = 0;
6189
6190 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6191 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6192 {
6193 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() > modifier)
6194 modifier = (*i)->GetAmount();
6195 }
6196
6197 return modifier;
6198}

References GetAuraEffectsByType().

◆ GetMaxPositiveAuraModifierByMiscMask()

int32 Unit::GetMaxPositiveAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask,
const AuraEffect except = nullptr 
) const
6083{
6084 int32 modifier = 0;
6085
6086 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6087 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6088 {
6089 if (except != (*i) && (*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() > modifier)
6090 modifier = (*i)->GetAmount();
6091 }
6092
6093 return modifier;
6094}

References GetAuraEffectsByType(), and AuraEffect::GetMiscValue().

Referenced by AuraEffect::HandleAuraModResistanceExclusive(), and SpellTakenCritChance().

◆ GetMaxPositiveAuraModifierByMiscValue()

int32 Unit::GetMaxPositiveAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6135{
6136 int32 modifier = 0;
6137
6138 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6139 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6140 {
6141 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() > modifier)
6142 modifier = (*i)->GetAmount();
6143 }
6144
6145 return modifier;
6146}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult().

◆ GetMaxPower()

uint32 Unit::GetMaxPower ( Powers  power) const
inline
1061{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power); }
@ UNIT_FIELD_MAXPOWER1
Definition: UpdateFields.h:105

References Object::GetUInt32Value(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::_SaveStats(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_gen_replenishment_aura::CalculateAmount(), spell_item_skull_of_impeding_doom::CalculateManaLeechAmount(), Spell::CheckItems(), Player::Create(), boss_shade_of_aran::DamageTaken(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerBurn(), Spell::EffectResurrect(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), GetPowerPct(), Player::GiveLevel(), HandleAuraProc(), Aura::HandleAuraSpecificMods(), HandleDummyAuraProc(), modify_commandscript::HandleModifyEnergyCommand(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_hun_ascpect_of_the_viper::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_kelthuzad_detonate_mana_aura::HandleScript(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), boss_curator::JustEngagedWith(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), ModifyPowerPct(), boss_shade_of_aran::OnPowerUpdate(), boss_selin_fireheart::OnPowerUpdate(), Acore::PowerPctOrderPred::operator()(), Player::outDebugValues(), spell_item_oracle_ablutions::PrepareSpellScript(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), spell_bronjahm_magic_bane::RecalculateDamage(), Creature::Regenerate(), Player::Regenerate(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetPower(), setPowerType(), Player::SummonPet(), boss_moam::UpdateAI(), boss_faction_championsAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), Player::UpdateCharmedAI(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxSkillValueForLevel()

uint16 Unit::GetMaxSkillValueForLevel ( Unit const *  target = nullptr) const
inline
1134{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }
uint8 getLevelForTarget(WorldObject const *) const override
Definition: Unit.h:1029

References GetLevel(), and getLevelForTarget().

Referenced by Player::GetMaxSkillValueForLevel(), GetUnitCriticalChance(), GetWeaponSkillValue(), isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), and SpellTakenCritChance().

◆ GetMechanicResistChance()

int32 Unit::GetMechanicResistChance ( SpellInfo const *  spell)
3168{
3169 if (!spell)
3170 return 0;
3171 int32 resist_mech = 0;
3172 for (uint8 eff = 0; eff < MAX_SPELL_EFFECTS; ++eff)
3173 {
3174 if (!spell->Effects[eff].IsEffect())
3175 break;
3176 int32 effect_mech = spell->GetEffectMechanic(eff);
3177 if (effect_mech)
3178 {
3180 if (resist_mech < temp)
3181 resist_mech = temp;
3182 }
3183 }
3184 return resist_mech;
3185}
@ SPELL_AURA_MOD_MECHANIC_RESISTANCE
Definition: SpellAuraDefines.h:180
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:6110

References SpellInfo::Effects, SpellInfo::GetEffectMechanic(), GetTotalAuraModifierByMiscValue(), MAX_SPELL_EFFECTS, and SPELL_AURA_MOD_MECHANIC_RESISTANCE.

Referenced by MagicSpellHitResult(), and MeleeSpellHitResult().

◆ GetMeleeAttackPoint()

bool Unit::GetMeleeAttackPoint ( Unit attacker,
Position pos 
)
2704{
2705 if (!attacker)
2706 {
2707 return false;
2708 }
2709
2710 AttackerSet attackers = getAttackers();
2711
2712 if (attackers.size() <= 1) // if the attackers are not more than one
2713 {
2714 return false;
2715 }
2716
2717 float meleeReach = GetExactDist2d(attacker);
2718 if (meleeReach <= 0)
2719 {
2720 return false;
2721 }
2722
2723 float minAngle = 0;
2724 Unit *refUnit = nullptr;
2725 uint32 validAttackers = 0;
2726
2727 double attackerSize = attacker->GetCollisionRadius();
2728
2729 for (auto const& otherAttacker: attackers)
2730 {
2731 // if the otherAttacker is not valid, skip
2732 if (!otherAttacker || otherAttacker->GetGUID() == attacker->GetGUID() ||
2733 !otherAttacker->IsWithinMeleeRange(this) || otherAttacker->isMoving())
2734 {
2735 continue;
2736 }
2737
2738 float curretAngle = atan(attacker->GetExactDist2d(otherAttacker) / meleeReach);
2739 if (minAngle == 0 || curretAngle < minAngle)
2740 {
2741 minAngle = curretAngle;
2742 refUnit = otherAttacker;
2743 }
2744
2745 validAttackers++;
2746 }
2747
2748 if (!validAttackers || !refUnit)
2749 {
2750 return false;
2751 }
2752
2753 float contactDist = attackerSize + refUnit->GetCollisionRadius();
2754 float requiredAngle = atan(contactDist / meleeReach);
2755 float attackersAngle = atan(attacker->GetExactDist2d(refUnit) / meleeReach);
2756
2757 // in instance: the more attacker there are, the higher will be the tollerance
2758 // outside: creatures should not intersecate
2759 float angleTollerance = attacker->GetMap()->IsDungeon() ? requiredAngle - requiredAngle * tanh(validAttackers / 5.0f) : requiredAngle;
2760
2761 if (attackersAngle > angleTollerance)
2762 {
2763 return false;
2764 }
2765
2766 double angle = atan(contactDist / meleeReach);
2767
2768 float angularRadius = frand(0.1f, 0.3f) + angle;
2769 int8 direction = (urand(0, 1) ? -1 : 1);
2770 float currentAngle = GetAngle(refUnit);
2771 float absAngle = currentAngle + angularRadius * direction;
2772
2773 float x, y, z;
2774 float distance = meleeReach - GetObjectSize();
2775 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle);
2776
2777 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2778 {
2779 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle * -1); // try the other side
2780
2781 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2782 {
2783 return false;
2784 }
2785 }
2786
2787 pos.Relocate(x, y, z);
2788
2789 return true;
2790}
std::int8_t int8
Definition: Define.h:105
float frand(float min, float max)
Definition: Random.cpp:57
void GetNearPoint(WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
Definition: Object.cpp:2619
float GetExactDist2d(const float x, const float y) const
Definition: Position.h:170
float GetCollisionRadius() const override
this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by t...
Definition: Unit.cpp:20960
std::unordered_set< Unit * > AttackerSet
Definition: Unit.h:622
AttackerSet const & getAttackers() const
Definition: Unit.h:847
bool IsDungeon() const
Definition: Map.h:295

References frand(), Position::GetAngle(), getAttackers(), GetCollisionRadius(), Position::GetExactDist2d(), Object::GetGUID(), WorldObject::GetMap(), WorldObject::GetNearPoint(), WorldObject::GetObjectSize(), Map::IsDungeon(), Position::Relocate(), and urand().

Referenced by MotionMaster::MoveCircleTarget().

◆ GetMeleeCritChanceReduction()

float Unit::GetMeleeCritChanceReduction ( ) const
inline

◆ GetMeleeCritDamageReduction()

uint32 Unit::GetMeleeCritDamageReduction ( uint32  damage) const
inline
1203{ return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_MELEE, 2.2f, 33.0f, damage); }
uint32 GetCombatRatingDamageReduction(CombatRating cr, float rate, float cap, uint32 damage) const
Definition: Unit.cpp:19291

References CR_CRIT_TAKEN_MELEE, and GetCombatRatingDamageReduction().

Referenced by ApplyResilience(), and processDummyAuras().

◆ GetMeleeDamageReduction()

uint32 Unit::GetMeleeDamageReduction ( uint32  damage) const
inline

◆ GetMeleeDamageSchoolMask()

virtual SpellSchoolMask Unit::GetMeleeDamageSchoolMask ( WeaponAttackType  attackType = BASE_ATTACK,
uint8  damageIndex = 0 
) const
pure virtual

Implemented in Player, and Creature.

Referenced by CalculateMeleeDamage().

◆ GetMeleeHitRedirectTarget()

Unit * Unit::GetMeleeHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo = nullptr 
)
11153{
11155 for (AuraEffectList::const_iterator i = hitTriggerAuras.begin(); i != hitTriggerAuras.end(); ++i)
11156 {
11157 if (Unit* magnet = (*i)->GetBase()->GetCaster())
11158 if (_IsValidAttackTarget(magnet, spellInfo) && magnet->IsWithinLOSInMap(this)
11159 && (!spellInfo || (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11160 && spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK)))
11161 if (roll_chance_i((*i)->GetAmount()))
11162 {
11163 (*i)->GetBase()->DropCharge(AURA_REMOVE_BY_EXPIRE);
11164 return magnet;
11165 }
11166 }
11167 return victim;
11168}
@ SPELL_AURA_ADD_CASTER_HIT_TRIGGER
Definition: SpellAuraDefines.h:174
bool roll_chance_i(int chance)
Definition: Random.h:63

References _IsValidAttackTarget(), AURA_REMOVE_BY_EXPIRE, SpellInfo::CheckExplicitTarget(), SpellInfo::CheckTarget(), GetAuraEffectsByType(), roll_chance_i(), SPELL_AURA_ADD_CASTER_HIT_TRIGGER, and SPELL_CAST_OK.

Referenced by AttackerStateUpdate(), spell_dk_dancing_rune_weapon::HandleProc(), and Spell::SelectExplicitTargets().

◆ GetMeleeRange()

float Unit::GetMeleeRange ( Unit const *  target) const
685{
686 float range = GetCombatReach() + target->GetCombatReach() + 4.0f / 3.0f;
687 return std::max(range, NOMINAL_MELEE_RANGE);
688}
#define NOMINAL_MELEE_RANGE
Definition: ObjectDefines.h:47
float GetCombatReach() const override
Definition: Unit.h:824

References GetCombatReach(), and NOMINAL_MELEE_RANGE.

Referenced by SmartAI::DistanceYourself(), GetRandomContactPoint(), IsWithinMeleeRange(), CreatureAI::MoveBackwardsChecks(), and SmartScript::ProcessAction().

◆ GetMeleeReach()

float Unit::GetMeleeReach ( ) const
inline
825{ float reach = m_floatValues[UNIT_FIELD_COMBATREACH]; return reach > MIN_MELEE_REACH ? reach : MIN_MELEE_REACH; }
#define MIN_MELEE_REACH
Definition: ObjectDefines.h:46

References Object::m_floatValues, MIN_MELEE_REACH, and UNIT_FIELD_COMBATREACH.

Referenced by boss_veknilash::JustEngagedWith(), and npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI().

◆ GetMinionGUID()

ObjectGuid Unit::GetMinionGUID ( ) const
inline
@ UNIT_FIELD_SUMMON
Definition: UpdateFields.h:87

References Object::GetGuidValue(), and UNIT_FIELD_SUMMON.

Referenced by GetFirstControlled(), GetFirstMinion(), and OutDebugInfo().

◆ GetModelForForm()

uint32 Unit::GetModelForForm ( ShapeshiftForm  form,
uint32  spellId 
)
19298{
19299 // Hardcoded cases
19300 switch (spellId)
19301 {
19302 case 7090: // Bear form
19303 return 29414;
19304 case 35200: // Roc form
19305 return 4877;
19306 default:
19307 break;
19308 }
19309
19310 if (IsPlayer())
19311 {
19312 if (uint32 ModelId = sObjectMgr->GetModelForShapeshift(form, ToPlayer()))
19313 return ModelId;
19314 }
19315
19316 uint32 modelid = 0;
19317 SpellShapeshiftFormEntry const* formEntry = sSpellShapeshiftFormStore.LookupEntry(form);
19318 if (formEntry && formEntry->modelID_A)
19319 {
19320 // Take the alliance modelid as default
19321 if (!IsPlayer())
19322 return formEntry->modelID_A;
19323 else
19324 {
19326 modelid = formEntry->modelID_A;
19327 else
19328 modelid = formEntry->modelID_H;
19329
19330 // If the player is horde but there are no values for the horde modelid - take the alliance modelid
19331 if (!modelid && Player::TeamIdForRace(getRace()) == TEAM_HORDE)
19332 modelid = formEntry->modelID_A;
19333 }
19334 }
19335
19336 return modelid;
19337}
@ TEAM_ALLIANCE
Definition: SharedDefines.h:771
@ TEAM_HORDE
Definition: SharedDefines.h:772
static TeamId TeamIdForRace(uint8 race)
Definition: Player.cpp:5866
uint8 getRace(bool original=false) const
Definition: Unit.cpp:20866
uint32 modelID_H
Definition: DBCStructure.h:1828
uint32 modelID_A
Definition: DBCStructure.h:1827

References getRace(), Object::IsPlayer(), SpellShapeshiftFormEntry::modelID_A, SpellShapeshiftFormEntry::modelID_H, sObjectMgr, sSpellShapeshiftFormStore, TEAM_ALLIANCE, TEAM_HORDE, Player::TeamIdForRace(), and Object::ToPlayer().

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), and RestoreDisplayId().

◆ GetModifierValue()

float Unit::GetModifierValue ( UnitMods  unitMod,
UnitModifierType  modifierType 
) const
15390{
15391 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15392 {
15393 LOG_ERROR("entities.unit", "attempt to access non-existing modifier value from UnitMods!");
15394 return 0.0f;
15395 }
15396
15397 if (modifierType == TOTAL_PCT && m_auraModifiersGroup[unitMod][modifierType] <= 0.0f)
15398 return 0.0f;
15399
15400 return m_auraModifiersGroup[unitMod][modifierType];
15401}
@ MODIFIER_TYPE_END
Definition: Unit.h:131

References LOG_ERROR, m_auraModifiersGroup, MODIFIER_TYPE_END, TOTAL_PCT, and UNIT_MOD_END.

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectWeaponDmg(), Guardian::UpdateArmor(), Player::UpdateArmor(), Creature::UpdateAttackPowerAndDamage(), Guardian::UpdateAttackPowerAndDamage(), Player::UpdateAttackPowerAndDamage(), Guardian::UpdateDamagePhysical(), Guardian::UpdateMaxHealth(), Player::UpdateMaxHealth(), Guardian::UpdateMaxPower(), Player::UpdateMaxPower(), and Player::UpdateResistances().

◆ GetMotionMaster() [1/2]

MotionMaster * Unit::GetMotionMaster ( )
inline
1676{ return i_motionMaster; }

References i_motionMaster.

Referenced by _ExitVehicle(), HomeMovementGenerator< Creature >::_setTargetLocation(), PetAI::_stopAttack(), BattlegroundAV::AddAVCreature(), UnitAI::AttackStart(), FollowerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::AttackStart(), boss_magus_telestra::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_lady_malande::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), UnitAI::AttackStartCaster(), Creature::CanCreatureAttack(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CleanupBeforeRemoveFromMap(), boss_alar::ConstructWaypointsAndMove(), boss_isalien::DamageTaken(), boss_julianne::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), SmartAI::DistanceYourself(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_nightbane::DoAction(), npc_apothecary_genericAI::DoAction(), npc_harrison_jones::DoAction(), npc_amanishi_lookout::DoAction(), npc_chained_spirit::DoAction(), boss_anetheron::DoAction(), boss_azgalor::DoAction(), boss_kazrogal::DoAction(), boss_rage_winterchill::DoAction(), npc_hyjal_ground_trash::DoAction(), npc_hyjal_gargoyle::DoAction(), npc_hyjal_frost_wyrm::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_saurfang_event::npc_saurfang_eventAI::DoAction(), boss_professor_putricide::boss_professor_putricideAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), npc_argent_captainAI::DoAction(), npc_icc_spire_frostwyrm::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::DoAction(), npc_ahune_bunny::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_living_mojo::npc_living_mojoAI::DoAction(), npc_power_spark::npc_power_sparkAI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_maiev_illidan::DoAction(), npc_akama_shade::DoAction(), boss_nazan::DoAction(), boss_ghazan::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), PetAI::DoAttack(), Creature::DoFleeToGetAssistance(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoStartMovement(), ScriptedAI::DoStartNoMovement(), go_commandscript::DoTeleport(), Spell::EffectCharge(), Spell::EffectChargeDest(), Spell::EffectDistract(), Spell::EffectJump(), Spell::EffectJumpDest(), Spell::EffectPullTowards(), Spell::EffectSummonType(), boss_jindo::EnterEvadeMode(), npc_black_morass_summoned_add::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), npc_argent_captainAI::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), npc_burning_spirit::npc_burning_spiritAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_mrfloppy::npc_mrfloppyAI::EnterEvadeMode(), npc_pet_gen_argent_pony_bridle::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), boss_halazzi::EnterPhase(), boss_zuljin::EnterPhase(), VehicleDespawnEvent::Execute(), RestoreAttack::Execute(), OrcMoveEvent::Execute(), NpcRunToHome::Execute(), UtherBatteredHiltEvent::Execute(), SlaveRunEvent::Execute(), DelayedMovementEvent::Execute(), DaranavanMoveEvent::Execute(), FrostwyrmLandEvent::Execute(), SACActivateEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), AssistanceMovementGenerator::Finalize(), npc_singularity::FindAndFollowTarget(), npc_dark_iron_guzzler::FindNextKeg(), npc_hallows_end_soh::FinishEvent(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_nightbane::FlyToClosestPreFlyWayPoint(), Creature::FocusTarget(), CreatureGroup::FormationReset(), boss_volkhan::boss_volkhanAI::GoToAnvil(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_apothecary_lingering_fumes::HandleAfterCast(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), misc_commandscript::HandleAppearCommand(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), misc_commandscript::HandleComeToMeCommand(), spell_q12589_shoot_rjr::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_icc_geist_alarm::HandleEvent(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), spell_chapter2_persuasive_strike::HandleHit(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), spell_item_toxic_wasteling::HandleJump(), AuraEffect::HandleModPossessPet(), misc_commandscript::HandleMovegensCommand(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), npc_commandscript::HandleNpcFollowCommand(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), npc_commandscript::HandleNpcUnFollowCommand(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePlayerLoginFromDB(), spell_entropius_black_hole_effect::HandlePull(), spell_boss_magus_telestra_gravity_well::HandlePull(), PetAI::HandleReturnMovement(), spell_the_lich_king_valkyr_target_search::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_gen_ayamiss_swarmer_loop::HandleScript(), WorldSession::HandleSetRaidDifficultyOpcode(), spell_sindragosa_icy_grip_jump::HandleSpecial(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), spell_item_draenic_pale_ale::HandleSummon(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), wp_commandscript::HandleWpLoadCommand(), wp_commandscript::HandleWpUnLoadCommand(), boss_felmyst::InitializeAI(), boss_captain_skarloc::InitializeAI(), boss_lieutenant_drake::InitializeAI(), boss_glob_of_viscidus::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), boss_eck::boss_eckAI::InitializeAI(), npc_preparations_for_war_vehicle::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Totem::InitSummon(), boss_grand_warlock_nethekurse::IntroRP(), Creature::IsFreeToMove(), IsMutualChase(), boss_gahzranka::IsSummonedBy(), boss_aeonus::IsSummonedBy(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::IsSummonedBy(), npc_burning_spirit::npc_burning_spiritAI::IsSummonedBy(), npc_demonic_vapor::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::IsSummonedBy(), npc_pet_dk_ghoul::IsSummonedBy(), npc_spirit_shade::npc_spirit_shadeAI::IsSummonedBy(), Creature::IsUpdateNeeded(), JumpTo(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), boss_ayamiss::JustDied(), npc_cyclone::JustEngagedWith(), npc_sunblade_scout::JustEngagedWith(), boss_akilzon::JustEngagedWith(), npc_amanishi_scout::JustEngagedWith(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_grandmaster_vorpil::JustEngagedWith(), boss_warlord_kalithresh::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nazan::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_ayamiss::JustEngagedWith(), boss_felmyst::JustEngagedWith(), boss_janalai::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_alar::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), SmartAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), boss_ghazan::JustReachedHome(), boss_grand_warlock_nethekurse::JustReachedHome(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_auriaya::boss_auriayaAI::JustSummoned(), npc_frosthound::npc_frosthoundAI::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), boss_mekgineer_steamrigger::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_xevozz::boss_xevozzAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustSummoned(), boss_ingvar_the_plunderer::JustSummoned(), boss_vexallus::JustSummoned(), npc_kalecgos_kj::JustSummoned(), boss_janalai::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_hadronox::boss_hadronoxAI::JustSummoned(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_akama_shade::JustSummoned(), npc_creature_generator_akama::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), boss_mennu_the_betrayer::JustSummoned(), boss_kaelthas::JustSummoned(), boss_mechano_lord_capacitus::JustSummoned(), npc_rinji::npc_rinjiAI::JustSummoned(), npc_maghar_captive::npc_maghar_captiveAI::JustSummoned(), boss_ayamiss::JustSummoned(), Player::KillPlayer(), KnockbackFrom(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), Player::LeaveBattleground(), Creature::Motion_Initialize(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), PetAI::MovementInform(), boss_ebonroc::boss_ebonrocAI::MovementInform(), boss_nightbane::MovementInform(), npc_harrison_jones::MovementInform(), boss_bug_trio::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_four_horsemen::boss_four_horsemenAI::MovementInform(), npc_akama_illidan::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), boss_felmyst::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_cameron::MoveTheChildren(), boss_four_horsemen::boss_four_horsemenAI::MoveToCorner(), npc_janalai_hatcher::MoveToNewWaypoint(), npc_concentrated_ball::npc_concentrated_ballAI::MoveToNextPoint(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), NearTeleportTo(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_omen::npc_omenAI::npc_omenAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::npc_pos_after_first_bossAI(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::npc_ulduar_saronite_vaporsAI(), spell_halion_twilight_phasing_aura::OnApply(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_hyjal_jaina::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_kernobee::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), spell_chapter5_light_of_dawn_aura::OnRemove(), spell_halion_twilight_phasing_aura::OnRemove(), SplineHandler::operator()(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_oculus_drake::npc_oculus_drakeAI::PassengerBoarded(), npc_vics_flying_machine::npc_vics_flying_machineAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), boss_nightbane::PathEndReached(), boss_anetheron::PathEndReached(), boss_rage_winterchill::PathEndReached(), npc_hyjal_ground_trash::PathEndReached(), npc_hyjal_frost_wyrm::PathEndReached(), boss_ambassador_hellmaw::PathEndReached(), npc_akama_illidan::PathEndReached(), boss_nefarian::PathEndReached(), npc_hyjal_gargoyle::PathEndReached(), PauseMovement(), SmartAI::PausePath(), PetSpellFail(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::PickNewLocation(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), propagateSpeedChange(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), RemoveCharmedBy(), boss_the_beast::boss_thebeastAI::Reset(), boss_felblood_kaelthas::Reset(), npc_acherus_necromancer::npc_acherus_necromancerAI::Reset(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_janalai::Reset(), npc_janalai_hatcher::Reset(), boss_arlokk::boss_arlokkAI::Reset(), npc_zulian_prowler::npc_zulian_prowlerAI::Reset(), npc_batrider::Reset(), npc_brew_bubble::Reset(), boss_archimonde::Reset(), boss_ayamiss::Reset(), boss_bug_trio::Reset(), boss_jedoga_shadowseeker::Reset(), boss_taldaram::Reset(), npc_kinetic_bomb::npc_kinetic_bombAI::Reset(), npc_assembly_lightning::npc_assembly_lightningAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_released_offspring_harkoa::npc_released_offspring_harkoaAI::Reset(), npc_voidtraveler::Reset(), boss_lady_vashj::Reset(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_infernal_attacker::npc_infernal_attackerAI::Reset(), npc_pet_gen_gnomish_flame_turret::Reset(), Creature::Respawn(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), ResumeMovement(), SmartAI::ResumePath(), Resurrect(), SmartAI::ReturnToLastOOCPos(), npc_escortAI::ReturnToLastPoint(), boss_alar::ScheduleAbilities(), boss_illidan_stormrage::ScheduleAbilities(), boss_magtheridon::ScheduleCombatEvents(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), boss_felmyst::ScheduleGroundAbilities(), boss_nightbane::ScheduleLand(), boss_laj::ScheduleTasks(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), WorldSession::SendDoFlight(), boss_sartharion::boss_sartharionAI::SendLavaWaves(), SetCharmedBy(), SmartAI::SetCombatMovement(), SetConfused(), SmartAI::SetCurrentRangeMode(), boss_grand_warlock_nethekurse::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), gunship_npc_AI::SetData(), npc_enslaved_proto_drake::SetData(), boss_the_beast::boss_thebeastAI::SetData(), npc_eastvale_peasent::SetData(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::SetData(), setDeathState(), Creature::setDeathState(), SetFeared(), SmartAI::SetFollow(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::SetGUID(), SetInCombatState(), Player::SetMover(), SetSpeed(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_harrison_jones::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_akama_illidan::sGossipSelect(), npc_akama_shade::sGossipSelect(), boss_thorim::boss_thorimAI::SpawnAnArenaNPC(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::SpellHit(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::SpellHit(), npc_saurfang_event::npc_saurfang_eventAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_forest_frog::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), npc_pet_gen_fetch_ball::SpellHitTarget(), boss_ionar::boss_ionarAI::Split(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_escortAI::Start(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), FollowerAI::StartFollow(), boss_felmyst::StartIntro(), WaypointMovementGenerator< Creature >::StartMove(), npc_stillpine_capitive::npc_stillpine_capitiveAI::StartMoving(), SmartAI::StartPath(), SmartAI::StopFollow(), SmartAI::StopPath(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_vazruden_the_herald::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), Spell::SummonGuardian(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave(), Player::TeleportTo(), CreatureAI::TriggerAlert(), Pet::Update(), Update(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_gyth::boss_gythAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_cameron::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_grand_magister_rommath::npc_grand_magister_rommathAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_akilzon_eagle::UpdateAI(), npc_forest_frog::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), npc_twilight_volunteer::UpdateAI(), npc_taldaram_flamesphere::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::UpdateAI(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_venture_co_straggler::npc_venture_co_stragglerAI::UpdateAI(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_batrider::UpdateAI(), npc_concentrated_ball::npc_concentrated_ballAI::UpdateAI(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::UpdateAI(), npc_xt002_boombot::npc_xt002_boombotAI::UpdateAI(), Player::UpdateCharmedAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_jenny::UpdateFollowerAI(), npc_emily::npc_emilyAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ GetMotionMaster() [2/2]

const MotionMaster * Unit::GetMotionMaster ( ) const
inline
1677{ return i_motionMaster; }

References i_motionMaster.

◆ GetMountID()

◆ GetNativeDisplayId()

◆ GetNativeObjectScale()

virtual float Unit::GetNativeObjectScale ( ) const
inlinevirtual

Reimplemented in Creature, and Pet.

1888{ return 1.0f; }

Referenced by RecalculateObjectScale().

◆ GetNegStat()

float Unit::GetNegStat ( Stats  stat) const
inline
1008{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_NEGSTAT0.

◆ GetNextRandomRaidMemberOrPet()

Unit * Unit::GetNextRandomRaidMemberOrPet ( float  radius)
11210{
11211 Player* player = nullptr;
11212 if (IsPlayer())
11213 player = ToPlayer();
11214 // Should we enable this also for charmed units?
11215 else if (IsCreature() && IsPet())
11216 player = GetOwner()->ToPlayer();
11217
11218 if (!player)
11219 return nullptr;
11220 Group* group = player->GetGroup();
11221 // When there is no group check pet presence
11222 if (!group)
11223 {
11224 // We are pet now, return owner
11225 if (player != this)
11226 return IsWithinDistInMap(player, radius) ? player : nullptr;
11227 Unit* pet = GetGuardianPet();
11228 // No pet, no group, nothing to return
11229 if (!pet)
11230 return nullptr;
11231 // We are owner now, return pet
11232 return IsWithinDistInMap(pet, radius) ? pet : nullptr;
11233 }
11234
11235 std::vector<Unit*> nearMembers;
11236 // reserve place for players and pets because resizing vector every unit push is unefficient (vector is reallocated then)
11237 nearMembers.reserve(group->GetMembersCount() * 2);
11238
11239 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
11240 if (Player* Target = itr->GetSource())
11241 {
11242 if (Target != this && !IsWithinDistInMap(Target, radius))
11243 continue;
11244
11245 // IsHostileTo check duel and controlled by enemy
11246 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
11247 nearMembers.push_back(Target);
11248
11249 // Push player's pet to vector
11250 if (Unit* pet = Target->GetGuardianPet())
11251 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
11252 nearMembers.push_back(pet);
11253 }
11254
11255 if (nearMembers.empty())
11256 return nullptr;
11257
11258 uint32 randTarget = urand(0, nearMembers.size() - 1);
11259 return nearMembers[randTarget];
11260}
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition: Object.cpp:1326
Group * GetGroup()
Definition: Player.h:2471
Guardian * GetGuardianPet() const
Definition: Unit.cpp:10746
Definition: Group.h:169
uint32 GetMembersCount() const
Definition: Group.h:245
GroupReference * GetFirstMember()
Definition: Group.h:243
Definition: GroupReference.h:27
GroupReference * next()
Definition: GroupReference.h:36

References Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), Group::GetMembersCount(), GetOwner(), Object::IsCreature(), IsHostileTo(), IsPet(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), GroupReference::next(), Object::ToPlayer(), and urand().

Referenced by HandleAuraRaidProcFromCharge(), and AuraEffect::HandleRaidProcFromChargeAuraProc().

◆ GetNpcFlags()

◆ GetOldFactionId()

uint32 Unit::GetOldFactionId ( ) const
inline
807{ return _oldFactionId; }

References _oldFactionId.

Referenced by npc_chesspiece::OnCharmed().

◆ GetOwnedAura()

Aura * Unit::GetOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
Aura except = nullptr 
) const
4826{
4827 AuraMapBounds range = m_ownedAuras.equal_range(spellId);
4828 for (AuraMap::const_iterator itr = range.first; itr != range.second; ++itr)
4829 {
4830 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask)
4831 && (!casterGUID || itr->second->GetCasterGUID() == casterGUID)
4832 && (!itemCasterGUID || itr->second->GetCastItemGUID() == itemCasterGUID)
4833 && (!except || except != itr->second))
4834 {
4835 return itr->second;
4836 }
4837 }
4838 return nullptr;
4839}
std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
Definition: Unit.h:626

References m_ownedAuras.

Referenced by _TryStackingOrRefreshingExistingAura().

◆ GetOwnedAuras() [1/2]

◆ GetOwnedAuras() [2/2]

AuraMap const & Unit::GetOwnedAuras ( ) const
inline
1299{ return m_ownedAuras; }

References m_ownedAuras.

◆ GetOwner()

Unit * Unit::GetOwner ( ) const
Todo:
: move this in Object class or move GetUInt32value here but keep consistency
10696{
10697 if (ObjectGuid ownerGUID = GetOwnerGUID())
10698 return ObjectAccessor::GetUnit(*this, ownerGUID);
10699
10700 return nullptr;
10701}

References GetOwnerGUID(), and ObjectAccessor::GetUnit().

Referenced by _ExitVehicle(), Acore::AnyAoETargetUnitInObjectRangeCheck::AnyAoETargetUnitInObjectRangeCheck(), ApplyDiminishingToDuration(), ApplyResilience(), TotemAI::AttackStart(), spell_dk_anti_magic_zone::CalculateAmount(), Creature::CanStartAttack(), spell_dk_blood_gorged::CheckProc(), spell_pri_mana_leech::CheckProc(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealHeal(), HostileRefMgr::deleteReferences(), npc_spring_rabbit::npc_spring_rabbitAI::DoAction(), Spell::DoAllEffectOnLaunchTarget(), Spell::DoAllEffectOnTarget(), PetAI::DoAttack(), Spell::EffectDispel(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), boss_illidari_council_memberAI::EnterEvadeMode(), GetCharmerOrOwner(), GetCombatRatingReduction(), GetNextRandomRaidMemberOrPet(), GetReactionTo(), GetSpellModOwner(), spell_warl_seduction::HandleAuraApply(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_sha_healing_stream_totem::HandleDummy(), spell_q12277_wintergarde_mine_explosion::HandleDummy(), spell_sha_mana_tide_totem::HandleDummy(), HandleDummyAuraProc(), spell_mount_check_aura::HandleEffectPeriodic(), spell_gen_gryphon_wyvern_mount_check::HandleEffectPeriodic(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), modify_commandscript::HandleModifyTalentCommand(), WorldSession::HandlePetActionHelper(), spell_warl_demonic_pact_aura::HandleProc(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), IsAlwaysVisibleFor(), IsPetAura(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::JustDied(), Kill(), MagicSpellHitResult(), MeleeDamageBonusDone(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_khunok_the_behemoth::npc_khunok_the_behemothAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_hun_aspect_of_the_beast::OnPetApply(), Acore::MostHPMissingGroupInRange::operator()(), PetSpellFail(), RemoveFromWorld(), npc_target_dummy::npc_target_dummyAI::Reset(), npc_spring_rabbit::npc_spring_rabbitAI::Reset(), RestoreFaction(), Creature::SelectVictim(), SendPetActionFeedback(), SendPetAIReaction(), SendPetTalk(), SetHealth(), SetMaxHealth(), SetMaxPower(), SetPower(), setPowerType(), SetStunned(), SpellDamageBonusDone(), SpellHealingBonusDone(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and UpdateAuraForGroup().

◆ GetOwnerGUID()

ObjectGuid Unit::GetOwnerGUID ( ) const
inline
@ UNIT_FIELD_SUMMONEDBY
Definition: UpdateFields.h:90

References Object::GetGuidValue(), and UNIT_FIELD_SUMMONEDBY.

Referenced by Pet::AddToWorld(), npc_living_mojo::npc_living_mojoAI::AttackStart(), BuildValuesUpdate(), PetAI::CanAttack(), CanFreeMove(), CanHaveThreatList(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), DealDamage(), Spell::DoAllEffectOnTarget(), FollowMovementGenerator< T >::DoUpdate(), GetCharmerOrOwnerGUID(), GetOwner(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModInvisibilityDetect(), AuraEffect::HandleModStealth(), AuraEffect::HandleModStealthDetect(), AuraEffect::HandleModStealthLevel(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetRename(), HandleSpellClick(), Creature::HasMechanicTemplateImmunity(), Creature::IsDungeonBoss(), Creature::IsImmuneToKnockback(), isInAccessiblePlaceFor(), Kill(), Creature::LoadSpellTemplateImmunity(), Condition::Meets(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_venomhide_hatchling::OnGossipHello(), Acore::MostHPMissingGroupInRange::operator()(), PlayerOrPetCheck::operator()(), OutDebugInfo(), PetAI::ReceiveEmote(), Creature::Regenerate(), RemoveAllControlled(), RemoveEvadeAuras(), Pet::SavePetToDB(), SetMinion(), SetOwnerGUID(), SpellPctDamageModsDone(), Map::SummonCreature(), NPCStaveQuestAI::UnitIsUnfair(), Creature::Update(), and npc_pet_dk_ebon_gargoyle::UpdateAI().

◆ GetPartyMembers()

void Unit::GetPartyMembers ( std::list< Unit * > &  units)
18917{
18918 Unit* owner = GetCharmerOrOwnerOrSelf();
18919 Group* group = nullptr;
18920 if (owner->IsPlayer())
18921 group = owner->ToPlayer()->GetGroup();
18922
18923 if (group)
18924 {
18925 uint8 subgroup = owner->ToPlayer()->GetSubGroup();
18926
18927 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
18928 {
18929 Player* Target = itr->GetSource();
18930
18931 // IsHostileTo check duel and controlled by enemy
18932 if (Target && Target->IsInMap(owner) && Target->GetSubGroup() == subgroup && !IsHostileTo(Target))
18933 {
18934 if (Target->IsAlive())
18935 TagUnitMap.push_back(Target);
18936
18937 for (Unit::ControlSet::iterator iterator = Target->m_Controlled.begin(); iterator != Target->m_Controlled.end(); ++iterator)
18938 {
18939 if (Unit* pet = *iterator)
18940 if (pet->IsGuardian() && pet->IsAlive())
18941 TagUnitMap.push_back(pet);
18942 }
18943 }
18944 }
18945 }
18946 else
18947 {
18948 if (owner->IsAlive())
18949 TagUnitMap.push_back(owner);
18950
18951 for (Unit::ControlSet::iterator itr = owner->m_Controlled.begin(); itr != owner->m_Controlled.end(); ++itr)
18952 {
18953 if (Unit* pet = *itr)
18954 if (pet->IsGuardian() && pet->IsAlive())
18955 TagUnitMap.push_back(pet);
18956 }
18957 }
18958}
uint8 GetSubGroup() const
Definition: Player.h:2475

References GetCharmerOrOwnerOrSelf(), Group::GetFirstMember(), Player::GetGroup(), Player::GetSubGroup(), IsAlive(), IsHostileTo(), WorldObject::IsInMap(), Object::IsPlayer(), m_Controlled, GroupReference::next(), and Object::ToPlayer().

Referenced by spell_warr_improved_spell_reflection_trigger_aura::HandleRemove().

◆ GetPetGUID()

◆ GetPhaseByAuras()

uint32 Unit::GetPhaseByAuras ( ) const
19136{
19137 uint32 currentPhase = 0;
19139 if (!phases.empty())
19140 for (AuraEffectList::const_iterator itr = phases.begin(); itr != phases.end(); ++itr)
19141 currentPhase |= (*itr)->GetMiscValue();
19142
19143 return currentPhase;
19144}
@ SPELL_AURA_PHASE
Definition: SpellAuraDefines.h:324

References GetAuraEffectsByType(), and SPELL_AURA_PHASE.

Referenced by Player::GetPhaseMaskForSpawn(), AuraEffect::HandlePhase(), and Player::SetGameMaster().

◆ GetPosStat()

float Unit::GetPosStat ( Stats  stat) const
inline
1007{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_POSSTAT0.

◆ GetPower()

uint32 Unit::GetPower ( Powers  power) const
inline
1060{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power); }
@ UNIT_FIELD_POWER1
Definition: UpdateFields.h:97

References Object::GetUInt32Value(), and UNIT_FIELD_POWER1.

Referenced by PetAI::_canMeleeAttack(), Player::_SaveCharacter(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_igb_cannon_blast::CalculatePower(), Creature::CanCastSpell(), Spell::CheckItems(), Spell::CheckPower(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), Spell::EffectCastButtons(), Spell::EffectWeaponDmg(), Pet::FillPetInfo(), Pet::GetHappinessState(), GetPowerPct(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), AuraEffect::HandleObsModPowerAuraTick(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetAbandon(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_pal_lay_on_hands::HandleScript(), Player::InitStatsForLevel(), npc_obsidian_destroyer::JustEngagedWith(), spell_gen_replenishment_aura::Load(), Pet::LoseHappiness(), ModifyPower(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), Acore::PowerPctOrderPred::operator()(), SmartScript::ProcessAction(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::Regenerate(), Player::Regenerate(), Creature::RegenerateHealth(), Player::SaveManaBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), ScriptedAI::SelectSpell(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetMaxPower(), SetPower(), setPowerType(), spell_igb_incinerating_blast::StoreEnergy(), Aura::Update(), boss_moam::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), PetAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ GetPowerPct()

float Unit::GetPowerPct ( Powers  power) const
inline
1062{ return GetMaxPower(power) ? 100.f * GetPower(power) / GetMaxPower(power) : 0.0f; }
uint32 GetMaxPower(Powers power) const
Definition: Unit.h:1061
uint32 GetPower(Powers power) const
Definition: Unit.h:1060

References GetMaxPower(), and GetPower().

Referenced by npc_obsidian_destroyer::JustEngagedWith(), npc_obsidian_eradicator::JustEngagedWith(), npc_obsidian_nullifier::JustEngagedWith(), boss_curator::JustEngagedWith(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), and boss_hazzarah::UpdateAI().

◆ getPowerType()

◆ GetPowerTypeByAuraGroup()

Powers Unit::GetPowerTypeByAuraGroup ( UnitMods  unitMod) const
15508{
15509 switch (unitMod)
15510 {
15511 case UNIT_MOD_RAGE:
15512 return POWER_RAGE;
15513 case UNIT_MOD_FOCUS:
15514 return POWER_FOCUS;
15515 case UNIT_MOD_ENERGY:
15516 return POWER_ENERGY;
15517 case UNIT_MOD_HAPPINESS:
15518 return POWER_HAPPINESS;
15519 case UNIT_MOD_RUNE:
15520 return POWER_RUNE;
15522 return POWER_RUNIC_POWER;
15523 default:
15524 case UNIT_MOD_MANA:
15525 return POWER_MANA;
15526 }
15527}
@ UNIT_MOD_RUNE
Definition: Unit.h:155
@ UNIT_MOD_ENERGY
Definition: Unit.h:153
@ UNIT_MOD_FOCUS
Definition: Unit.h:152
@ UNIT_MOD_HAPPINESS
Definition: Unit.h:154
@ UNIT_MOD_MANA
Definition: Unit.h:150
@ UNIT_MOD_RAGE
Definition: Unit.h:151
@ UNIT_MOD_RUNIC_POWER
Definition: Unit.h:156

References POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNE, POWER_RUNIC_POWER, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RUNE, and UNIT_MOD_RUNIC_POWER.

Referenced by HandleStatModifier().

◆ GetPPMProcChance()

float Unit::GetPPMProcChance ( uint32  WeaponSpeed,
float  PPM,
SpellInfo const *  spellProto 
) const
13546{
13547 // proc per minute chance calculation
13548 if (PPM <= 0)
13549 return 0.0f;
13550
13551 // Apply chance modifer aura
13552 if (spellProto)
13553 if (Player* modOwner = GetSpellModOwner())
13554 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_PROC_PER_MINUTE, PPM);
13555
13556 return (WeaponSpeed * PPM) / 600.0f; // result is chance in percents (probability = Speed_in_sec * (PPM / 60))
13557}
@ SPELLMOD_PROC_PER_MINUTE
Definition: SpellDefines.h:102

References GetSpellModOwner(), SpellInfo::Id, and SPELLMOD_PROC_PER_MINUTE.

Referenced by Player::CastItemCombatSpell(), and IsTriggeredAtSpellProcEvent().

◆ GetProcAurasTriggeredOnEvent()

void Unit::GetProcAurasTriggeredOnEvent ( std::list< AuraApplication * > &  aurasTriggeringProc,
std::list< AuraApplication * > *  procAuras,
ProcEventInfo  eventInfo 
)
16597{
16598 // use provided list of auras which can proc
16599 if (procAuras)
16600 {
16601 for (std::list<AuraApplication*>::iterator itr = procAuras->begin(); itr != procAuras->end(); ++itr)
16602 {
16603 ASSERT((*itr)->GetTarget() == this);
16604 if (!(*itr)->GetRemoveMode())
16605 if ((*itr)->GetBase()->IsProcTriggeredOnEvent(*itr, eventInfo))
16606 {
16607 (*itr)->GetBase()->PrepareProcToTrigger(*itr, eventInfo);
16608 aurasTriggeringProc.push_back(*itr);
16609 }
16610 }
16611 }
16612 // or generate one on our own
16613 else
16614 {
16615 for (AuraApplicationMap::iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16616 {
16617 if (itr->second->GetBase()->IsProcTriggeredOnEvent(itr->second, eventInfo))
16618 {
16619 itr->second->GetBase()->PrepareProcToTrigger(itr->second, eventInfo);
16620 aurasTriggeringProc.push_back(itr->second);
16621 }
16622 }
16623 }
16624}

References ASSERT, and GetAppliedAuras().

Referenced by TriggerAurasProcOnEvent().

◆ getRace()

uint8 Unit::getRace ( bool  original = false) const
20867{
20868 if (IsPlayer())
20869 {
20870 if (original)
20871 return m_realRace;
20872 else
20873 return m_race;
20874 }
20875
20877}

References Object::GetByteValue(), Object::IsPlayer(), m_race, m_realRace, and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), Player::BuildPlayerRepop(), Corpse::BuildValuesUpdate(), Player::CheckSkillLearnedBySpell(), Player::CreateCorpse(), GetModelForForm(), ObjectMgr::GetModelForShapeshift(), getRaceMask(), GetReactionTo(), Player::GetStartPosition(), Player::GetTeamId(), Player::GiveLevel(), WorldSession::HandleAlterAppearance(), AuraEffect::HandleAuraTransform(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Creature::IsValidTrainerForPlayer(), Channel::KickOrBan(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), InstanceScript::OnPlayerLeave(), RestoreFaction(), Player::RewardHonor(), WorldSession::SendNameQueryOpcode(), Player::SetGameMaster(), Player::StoreNewItemInBestSlots(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getRaceMask()

◆ GetRandomContactPoint()

bool Unit::GetRandomContactPoint ( Unit const *  target,
float &  x,
float &  y,
float &  z,
bool  force = false 
) const
716{
717 float combat_reach = GetCombatReach();
718 if (combat_reach < 0.1f) // sometimes bugged for players
719 combat_reach = DEFAULT_COMBAT_REACH;
720
721 uint32 attacker_number = getAttackers().size();
722 if (attacker_number > 0)
723 --attacker_number;
724 Creature const* c = obj->ToCreature();
725 if (c)
726 if (c->isWorldBoss() || c->IsDungeonBoss() || (obj->IsPet() && const_cast<Unit*>(obj)->ToPet()->isControlled()))
727 attacker_number = 0; // pussywizard: pets and bosses just come to target from their angle
728
729 GetNearPoint(obj, x, y, z, isMoving() ? (obj->GetCombatReach() > 7.75f ? obj->GetCombatReach() - 7.5f : 0.25f) : obj->GetCombatReach(), 0.0f,
730 GetAngle(obj) + (attacker_number ? (static_cast<float>(M_PI / 2) - static_cast<float>(M_PI) * (float)rand_norm()) * float(attacker_number) / combat_reach * 0.3f : 0));
731
732 // pussywizard
733 if (std::fabs(this->GetPositionZ() - z) > this->GetCollisionHeight() || !IsWithinLOS(x, y, z))
734 {
735 x = this->GetPositionX();
736 y = this->GetPositionY();
737 z = this->GetPositionZ();
738 obj->UpdateAllowedPositionZ(x, y, z);
739 }
740 float maxDist = GetMeleeRange(obj);
741 if (GetExactDistSq(x, y, z) >= maxDist * maxDist)
742 {
743 if (force)
744 {
745 x = this->GetPositionX();
746 y = this->GetPositionY();
747 z = this->GetPositionZ();
748 return true;
749 }
750 return false;
751 }
752 return true;
753}
#define DEFAULT_COMBAT_REACH
Definition: ObjectDefines.h:45
bool IsDungeonBoss() const
Definition: Creature.cpp:3178
bool IsWithinLOS(float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
Definition: Object.cpp:1331
float GetExactDistSq(float x, float y, float z) const
Definition: Position.h:174
bool isControlled() const
Definition: Pet.h:54
float GetCollisionHeight() const override
Return collision height sent to client.
Definition: Unit.cpp:20966
float GetMeleeRange(Unit const *target) const
Definition: Unit.cpp:684

References DEFAULT_COMBAT_REACH, Position::GetAngle(), getAttackers(), GetCollisionHeight(), GetCombatReach(), Position::GetExactDistSq(), GetMeleeRange(), WorldObject::GetNearPoint(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Pet::isControlled(), Creature::IsDungeonBoss(), isMoving(), IsPet(), WorldObject::IsWithinLOS(), Creature::isWorldBoss(), rand_norm(), Object::ToCreature(), ToPet(), and WorldObject::UpdateAllowedPositionZ().

Referenced by boss_bug_trio::DamageTaken(), and boss_bug_trio::DoFinalSpell().

◆ GetRangedCritChanceReduction()

float Unit::GetRangedCritChanceReduction ( ) const
inline

◆ GetRangedCritDamageReduction()

uint32 Unit::GetRangedCritDamageReduction ( uint32  damage) const
inline

◆ GetRangedDamageReduction()

uint32 Unit::GetRangedDamageReduction ( uint32  damage) const
inline

◆ GetReactionTo()

ReputationRank Unit::GetReactionTo ( Unit const *  target,
bool  checkOriginalFaction = false 
) const
10135{
10136 // always friendly to self
10137 if (this == target)
10138 return REP_FRIENDLY;
10139
10140 // always friendly to charmer or owner
10142 return REP_FRIENDLY;
10143
10144 Player const* selfPlayerOwner = GetAffectingPlayer();
10145 Player const* targetPlayerOwner = target->GetAffectingPlayer();
10146
10147 // check forced reputation to support SPELL_AURA_FORCE_REACTION
10148 if (selfPlayerOwner)
10149 {
10150 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10151 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10152 return *repRank;
10153 }
10154 else if (targetPlayerOwner)
10155 {
10156 if (FactionTemplateEntry const* selfFactionTemplateEntry = GetFactionTemplateEntry())
10157 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(selfFactionTemplateEntry))
10158 return *repRank;
10159 }
10160
10162 {
10163 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
10164 {
10165 if (selfPlayerOwner && targetPlayerOwner)
10166 {
10167 // always friendly to other unit controlled by player, or to the player himself
10168 if (selfPlayerOwner == targetPlayerOwner)
10169 return REP_FRIENDLY;
10170
10171 // duel - always hostile to opponent
10172 if (selfPlayerOwner->duel && selfPlayerOwner->duel->Opponent == targetPlayerOwner && selfPlayerOwner->duel->State == DUEL_STATE_IN_PROGRESS)
10173 return REP_HOSTILE;
10174
10175 // same group - checks dependant only on our faction - skip FFA_PVP for example
10176 if (selfPlayerOwner->IsInRaidWith(targetPlayerOwner))
10177 return REP_FRIENDLY; // return true to allow config option AllowTwoSide.Interaction.Group to work
10178 // however client seems to allow mixed group parties, because in 13850 client it works like:
10179 // return GetFactionReactionTo(GetFactionTemplateEntry(), target);
10180 }
10181
10182 // check FFA_PVP
10183 if (IsFFAPvP() && target->IsFFAPvP())
10184 return REP_HOSTILE;
10185
10186 if (selfPlayerOwner)
10187 {
10188 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10189 {
10190 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10191 return *repRank;
10192 if (!selfPlayerOwner->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10193 {
10194 if (FactionEntry const* targetFactionEntry = sFactionStore.LookupEntry(targetFactionTemplateEntry->faction))
10195 {
10196 if (targetFactionEntry->CanHaveReputation())
10197 {
10198 // check contested flags
10199 if (targetFactionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10200 && selfPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10201 return REP_HOSTILE;
10202
10203 // if faction has reputation, hostile state depends only from AtWar state
10204 if (selfPlayerOwner->GetReputationMgr().IsAtWar(targetFactionEntry))
10205 return REP_HOSTILE;
10206 return REP_FRIENDLY;
10207 }
10208 }
10209 }
10210 }
10211 }
10212 }
10213 }
10214
10215 ReputationRank repRank = REP_HATED;
10216 if (!sScriptMgr->IfNormalReaction(this, target, repRank))
10217 {
10218 return ReputationRank(repRank);
10219 }
10220
10221 FactionTemplateEntry const* factionTemplateEntry = nullptr;
10222 if (checkOriginalFaction)
10223 {
10224 if (IsPlayer())
10225 {
10226 if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(getRace()))
10227 {
10228 factionTemplateEntry = sFactionTemplateStore.LookupEntry(rEntry->FactionID);
10229 }
10230 }
10231 else
10232 {
10233 Unit* owner = GetOwner();
10234 if (HasUnitTypeMask(UNIT_MASK_MINION) && owner)
10235 {
10236 factionTemplateEntry = sFactionTemplateStore.LookupEntry(owner->GetFaction());
10237 }
10238 else if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate())
10239 {
10240 factionTemplateEntry = sFactionTemplateStore.LookupEntry(cinfo->faction);
10241 }
10242 }
10243 }
10244
10245 if (!factionTemplateEntry)
10246 {
10247 factionTemplateEntry = GetFactionTemplateEntry();
10248 }
10249
10250 // do checks dependant only on our faction
10251 return GetFactionReactionTo(factionTemplateEntry, target);
10252}
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
@ REP_HATED
Definition: SharedDefines.h:180
bool HasPlayerFlag(PlayerFlags flags) const
Definition: Player.h:1111
ReputationRank GetFactionReactionTo(FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
Definition: Unit.cpp:10254
bool IsInRaidWith(Unit const *unit) const
Definition: Unit.cpp:18894
bool IsAtWar(uint32 faction_id) const
Definition: ReputationMgr.cpp:55
Definition: DBCStructure.h:679

References Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, GetAffectingPlayer(), GetCharmerOrOwnerOrSelf(), GetFaction(), GetFactionReactionTo(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetOwner(), getRace(), Player::GetReputationMgr(), Player::HasPlayerFlag(), HasUnitFlag(), HasUnitFlag2(), HasUnitTypeMask(), ReputationMgr::IsAtWar(), IsFFAPvP(), IsInRaidWith(), Object::IsPlayer(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HATED, REP_HOSTILE, sChrRacesStore, sFactionStore, sFactionTemplateStore, sScriptMgr, Object::ToCreature(), UNIT_FLAG2_IGNORE_REPUTATION, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_MINION.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), Player::GetNPCIfCanInteractWith(), IsFriendlyTo(), IsHostileTo(), and Condition::Meets().

◆ GetRedirectThreatPercent()

uint32 Unit::GetRedirectThreatPercent ( )
inline
uint32 GetThreatPct() const
Definition: ThreatMgr.h:299

References _redirectThreatInfo, and RedirectThreatInfo::GetThreatPct().

Referenced by ThreatMgr::DoAddThreat().

◆ GetRedirectThreatTarget()

Unit * Unit::GetRedirectThreatTarget ( ) const

◆ GetResistance() [1/2]

uint32 Unit::GetResistance ( SpellSchoolMask  mask) const
20182{
20183 int32 resist = -1;
20184 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
20185 if (mask & (1 << i) && (resist < 0 || resist > int32(GetResistance(SpellSchools(i)))))
20186 resist = int32(GetResistance(SpellSchools(i)));
20187
20188 // resist value will never be negative here
20189 return uint32(resist);
20190}

References GetResistance(), MAX_SPELL_SCHOOL, and SPELL_SCHOOL_NORMAL.

Referenced by Player::_SaveStats(), GetArmor(), GetEffectiveResistChance(), GetResistance(), and Player::outDebugValues().

◆ GetResistance() [2/2]

uint32 Unit::GetResistance ( SpellSchools  school) const
inline
1123{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_RESISTANCES) + school); }
@ UNIT_FIELD_RESISTANCES
Definition: UpdateFields.h:156

References Object::GetUInt32Value(), and UNIT_FIELD_RESISTANCES.

◆ GetResistanceBuffMods()

float Unit::GetResistanceBuffMods ( SpellSchools  school,
bool  positive 
) const
inline

◆ GetShapeshiftForm()

◆ GetSharedVisionList()

◆ GetSheath()

SheathState Unit::GetSheath ( ) const
inline
SheathState
Definition: UnitDefines.h:125

References Object::GetByteValue(), and UNIT_FIELD_BYTES_2.

◆ GetShieldBlockValue() [1/2]

virtual uint32 Unit::GetShieldBlockValue ( ) const
pure virtual

◆ GetShieldBlockValue() [2/2]

uint32 Unit::GetShieldBlockValue ( uint32  soft_cap,
uint32  hard_cap 
) const
inline
1102 {
1103 uint32 value = GetShieldBlockValue();
1104 if (value >= hard_cap)
1105 {
1106 value = (soft_cap + hard_cap) / 2;
1107 }
1108 else if (value > soft_cap)
1109 {
1110 value = soft_cap + ((value - soft_cap) / 2);
1111 }
1112
1113 return value;
1114 }

References GetShieldBlockValue().

◆ GetSingleCastAuras() [1/2]

AuraList & Unit::GetSingleCastAuras ( )
inline

◆ GetSingleCastAuras() [2/2]

AuraList const & Unit::GetSingleCastAuras ( ) const
inline
1355{ return m_scAuras; }

References m_scAuras.

◆ GetSpeed()

float Unit::GetSpeed ( UnitMoveType  mtype) const

◆ GetSpeedRate()

◆ GetSpellCritChanceReduction()

float Unit::GetSpellCritChanceReduction ( ) const
inline

◆ GetSpellCritDamageReduction()

◆ GetSpellDamageReduction()

uint32 Unit::GetSpellDamageReduction ( uint32  damage) const
inline

◆ GetSpellMaxRangeForTarget()

float Unit::GetSpellMaxRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15249{
15250 if (!spellInfo->RangeEntry)
15251 {
15252 return 0;
15253 }
15254
15255 if (spellInfo->RangeEntry->RangeMax[1] == spellInfo->RangeEntry->RangeMax[0])
15256 {
15257 return spellInfo->GetMaxRange();
15258 }
15259
15260 if (!target)
15261 {
15262 return spellInfo->GetMaxRange(true);
15263 }
15264
15265 return spellInfo->GetMaxRange(!IsHostileTo(target));
15266}

References SpellInfo::GetMaxRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMax.

Referenced by spell_sha_fire_nova::CheckFireTotem(), Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), ScriptedAI::SelectSpell(), GameObject::TriggeringLinkedGameObject(), and Pet::Update().

◆ GetSpellMinRangeForTarget()

float Unit::GetSpellMinRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15269{
15270 if (!spellInfo->RangeEntry)
15271 {
15272 return 0;
15273 }
15274
15275 if (spellInfo->RangeEntry->RangeMin[1] == spellInfo->RangeEntry->RangeMin[0])
15276 {
15277 return spellInfo->GetMinRange();
15278 }
15279
15280 return spellInfo->GetMinRange(!IsHostileTo(target));
15281}

References SpellInfo::GetMinRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMin.

Referenced by Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), and ScriptedAI::SelectSpell().

◆ GetSpellModOwner()

Player * Unit::GetSpellModOwner ( ) const
16661{
16662 if (Player* player = const_cast<Unit*>(this)->ToPlayer())
16663 {
16664 return player;
16665 }
16666
16667 if (Unit* owner = GetOwner())
16668 {
16669 if (Player* player = owner->ToPlayer())
16670 {
16671 return player;
16672 }
16673 }
16674
16675 // Special handling for Eye of Kilrogg
16677 {
16678 if (TempSummon const* tempSummon = ToTempSummon())
16679 {
16680 if (Unit* summoner = tempSummon->GetSummonerUnit())
16681 {
16682 return summoner->ToPlayer();
16683 }
16684 }
16685 }
16686
16687 return nullptr;
16688}
@ NPC_EYE_OF_KILROGG
Definition: PetDefines.h:101
Definition: TemporarySummon.h:40

References Object::GetEntry(), GetOwner(), NPC_EYE_OF_KILROGG, Object::ToPlayer(), and ToTempSummon().

Referenced by Spell::_cast(), Creature::AddSpellCooldown(), ApplyEffectModifiers(), CalcArmorReducedDamage(), SpellEffectInfo::CalcDamageMultiplier(), Aura::CalcDispelChance(), Aura::CalcMaxCharges(), Aura::CalcMaxDuration(), AuraEffect::CalcPeriodicCritChance(), SpellInfo::CalcPowerCost(), Aura::CalcProcChance(), SpellEffectInfo::CalcRadius(), ThreatCalcHelper::calcThreat(), spell_dru_brambles_treant::CalculateAmount(), AuraEffect::CalculatePeriodic(), CalculateSpellDamageTaken(), SpellEffectInfo::CalcValueMultiplier(), Spell::cancel(), Spell::cast(), Spell::CheckRange(), Spell::CheckRuneCost(), Spell::EffectSummonPet(), Spell::EffectSummonType(), Spell::finish(), GetEffectiveResistChance(), SpellInfo::GetMaxRange(), GetPPMProcChance(), Spell::handle_delayed(), Spell::handle_immediate(), IsAlwaysDetectableFor(), SpellInfo::IsStrongerAuraActive(), IsTriggeredAtSpellProcEvent(), MagicSpellHitResult(), MeleeDamageBonusDone(), MeleeSpellMissChance(), ModSpellCastTime(), Spell::SelectImplicitChainTargets(), Aura::SetDuration(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), SpellHealingBonusDone(), Spell::SummonGuardian(), Spell::TakePower(), Spell::TakeRunePower(), Spell::UpdateChanneledTargetList(), and Aura::UpdateOwner().

◆ GetSpellSchoolByAuraGroup()

SpellSchools Unit::GetSpellSchoolByAuraGroup ( UnitMods  unitMod) const
15447{
15449
15450 switch (unitMod)
15451 {
15453 school = SPELL_SCHOOL_HOLY;
15454 break;
15456 school = SPELL_SCHOOL_FIRE;
15457 break;
15459 school = SPELL_SCHOOL_NATURE;
15460 break;
15462 school = SPELL_SCHOOL_FROST;
15463 break;
15465 school = SPELL_SCHOOL_SHADOW;
15466 break;
15468 school = SPELL_SCHOOL_ARCANE;
15469 break;
15470
15471 default:
15472 break;
15473 }
15474
15475 return school;
15476}
@ UNIT_MOD_RESISTANCE_SHADOW
Definition: Unit.h:162
@ UNIT_MOD_RESISTANCE_FROST
Definition: Unit.h:161
@ UNIT_MOD_RESISTANCE_HOLY
Definition: Unit.h:158
@ UNIT_MOD_RESISTANCE_ARCANE
Definition: Unit.h:163
@ UNIT_MOD_RESISTANCE_FIRE
Definition: Unit.h:159
@ UNIT_MOD_RESISTANCE_NATURE
Definition: Unit.h:160
@ SPELL_SCHOOL_SHADOW
Definition: SharedDefines.h:299
@ SPELL_SCHOOL_NATURE
Definition: SharedDefines.h:297
@ SPELL_SCHOOL_FROST
Definition: SharedDefines.h:298
@ SPELL_SCHOOL_ARCANE
Definition: SharedDefines.h:300
@ SPELL_SCHOOL_FIRE
Definition: SharedDefines.h:296
@ SPELL_SCHOOL_HOLY
Definition: SharedDefines.h:295

References SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, and UNIT_MOD_RESISTANCE_SHADOW.

Referenced by HandleStatModifier().

◆ getStandState()

◆ GetStat()

◆ GetStatByAuraGroup()

Stats Unit::GetStatByAuraGroup ( UnitMods  unitMod) const
15479{
15480 Stats stat = STAT_STRENGTH;
15481
15482 switch (unitMod)
15483 {
15485 stat = STAT_STRENGTH;
15486 break;
15488 stat = STAT_AGILITY;
15489 break;
15491 stat = STAT_STAMINA;
15492 break;
15494 stat = STAT_INTELLECT;
15495 break;
15497 stat = STAT_SPIRIT;
15498 break;
15499
15500 default:
15501 break;
15502 }
15503
15504 return stat;
15505}
@ UNIT_MOD_STAT_INTELLECT
Definition: Unit.h:147
@ UNIT_MOD_STAT_SPIRIT
Definition: Unit.h:148
@ UNIT_MOD_STAT_STRENGTH
Definition: Unit.h:144
@ UNIT_MOD_STAT_AGILITY
Definition: Unit.h:145
@ UNIT_MOD_STAT_STAMINA
Definition: Unit.h:146
Stats
Definition: SharedDefines.h:268
@ STAT_SPIRIT
Definition: SharedDefines.h:273
@ STAT_INTELLECT
Definition: SharedDefines.h:272
@ STAT_AGILITY
Definition: SharedDefines.h:270
@ STAT_STRENGTH
Definition: SharedDefines.h:269
@ STAT_STAMINA
Definition: SharedDefines.h:271

References STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by HandleStatModifier().

◆ GetTarget()

◆ GetThreatMgr() [1/2]

ThreatMgr & Unit::GetThreatMgr ( )
inline
900{ return m_ThreatMgr; }

References m_ThreatMgr.

Referenced by CreatureAI::_EnterEvadeMode(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_hazzarah::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_mor_grayhoof::CastRandomSpell(), CleanupBeforeRemoveFromMap(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_magister_aledis::DamageTaken(), boss_ysondre::boss_ysondreAI::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), ScriptedAI::DoAddThreat(), UnitAI::DoCastToAllHostilePlayers(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoGetThreat(), ScriptedAI::DoModifyThreatByPercent(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), ScriptedAI::DoResetThreat(), ScriptedAI::DoResetThreatList(), Spell::EffectModifyThreatPercent(), Spell::EffectTaunt(), boss_faction_championsAI::EnemiesInRange(), boss_ragnaros::boss_ragnarosAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), boss_murmur::EnterEvadeMode(), boss_alar::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), boss_ouro::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), TemporaryThreatModifierEvent::Execute(), StartMovementEvent::Execute(), boss_supremus::FindHatefulStrikeTarget(), npc_raging_flames::FixateRandomTarget(), SmartScript::GetTargets(), UnitAI::GetThreatMgr(), debug_commandscript::HandleDebugThreatListCommand(), spell_karazhan_blink::HandleDummy(), spell_kaelthas_mind_control::HandleEffect(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_enveloping_webs::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), HandleProcTriggerSpell(), PetAI::HandleReturnMovement(), spell_pursue::HandleScript(), spell_gurtogg_eject::HandleScriptEffect(), spell_leotheras_whirlwind::HandleScriptEffect(), boss_attumen::IsSummonedBy(), boss_talon_king_ikiss::JustEngagedWith(), boss_blackheart_the_inciter::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_jindo::JustSummoned(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), Creature::ModifyThreatPercentTemp(), boss_bug_trio::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), NonTankTargetSelector::operator()(), PowerUsersSelector::operator()(), MalleableGooSelector::operator()(), StoneGripTargetSelector::operator()(), boss_jeklik::PathEndReached(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), boss_talon_king_ikiss::Reset(), boss_faction_championsAI::SelectEnemyCaster(), npc_scholomance_occultist::npc_scholomance_occultistAI::SelectUnitCasting(), SendChangeCurrentVictimOpcode(), SendThreatListUpdate(), setDeathState(), SetPhaseMask(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), boss_ouro::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), BossAI::TeleportCheaters(), Creature::Update(), Update(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_nefarian::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), boss_netherspite::UpdatePortals(), and CreatureAI::UpdateVictim().

◆ GetThreatMgr() [2/2]

ThreatMgr const & Unit::GetThreatMgr ( ) const
inline
901{ return m_ThreatMgr; }

References m_ThreatMgr.

◆ GetTotalAttackPowerValue()

float Unit::GetTotalAttackPowerValue ( WeaponAttackType  attType,
Unit pVictim = nullptr 
) const
15530{
15531 if (attType == RANGED_ATTACK)
15532 {
15534 if (victim)
15535 ap += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
15536
15537 if (ap < 0)
15538 return 0.0f;
15540 }
15541 else
15542 {
15544 if (victim)
15545 ap += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
15546
15547 if (ap < 0)
15548 return 0.0f;
15550 }
15551}
@ SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS
Definition: SpellAuraDefines.h:190
@ SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS
Definition: SpellAuraDefines.h:228
@ UNIT_FIELD_ATTACK_POWER_MODS
Definition: UpdateFields.h:163
@ UNIT_FIELD_RANGED_ATTACK_POWER
Definition: UpdateFields.h:165
@ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER
Definition: UpdateFields.h:167
@ UNIT_FIELD_ATTACK_POWER_MULTIPLIER
Definition: UpdateFields.h:164
@ UNIT_FIELD_ATTACK_POWER
Definition: UpdateFields.h:162
@ UNIT_FIELD_RANGED_ATTACK_POWER_MODS
Definition: UpdateFields.h:166
int32 GetInt32Value(uint16 index) const
Definition: Object.cpp:288

References Object::GetFloatValue(), Object::GetInt32Value(), GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, and UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER.

Referenced by spell_dk_ghoul_thrash::CalcDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_execute::HandleEffect(), spell_pal_seal_of_righteousness::HandleProc(), HandleProcTriggerSpell(), Spell::HandleThreatSpells(), Guardian::InitStatsForLevel(), SpellBaseDamageBonusDone(), SpellBaseHealingBonusDone(), SpellDamageBonusDone(), SpellHealingBonusDone(), Guardian::UpdateDamagePhysical(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetTotalAuraModifier()

◆ GetTotalAuraModifierAreaExclusive()

int32 Unit::GetTotalAuraModifierAreaExclusive ( AuraType  auratype) const
5987{
5988 int32 modifier = 0;
5989 int32 areaModifier = 0;
5990
5991 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5992 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5993 {
5994 if ((*i)->GetSpellInfo()->HasAreaAuraEffect())
5995 {
5996 if (areaModifier < (*i)->GetAmount())
5997 areaModifier = (*i)->GetAmount();
5998 }
5999 else
6000 modifier += (*i)->GetAmount();
6001 }
6002
6003 return modifier + areaModifier;
6004}

References GetAuraEffectsByType().

Referenced by Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByAffectMask()

int32 Unit::GetTotalAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6163{
6164 int32 modifier = 0;
6165
6166 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6167 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6168 if ((*i)->IsAffectedOnSpell(affectedSpell))
6169 modifier += (*i)->GetAmount();
6170
6171 return modifier;
6172}

References GetAuraEffectsByType().

◆ GetTotalAuraModifierByMiscMask()

int32 Unit::GetTotalAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6058{
6059 int32 modifier = 0;
6060
6061 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6062 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6063 {
6064 if ((*i)->GetMiscValue()& misc_mask)
6065 modifier += (*i)->GetAmount();
6066 }
6067 return modifier;
6068}

References GetAuraEffectsByType().

Referenced by CalcArmorReducedDamage(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), GetEffectiveResistChance(), MagicSpellHitResult(), SpellCriticalDamageBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), and Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByMiscValue()

int32 Unit::GetTotalAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6111{
6112 int32 modifier = 0;
6113
6114 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6115 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6116 if ((*i)->GetMiscValue() == misc_value)
6117 modifier += (*i)->GetAmount();
6118
6119 return modifier;
6120}

References GetAuraEffectsByType().

Referenced by Player::CalculateReputationGain(), GetMechanicResistChance(), MeleeSpellHitResult(), ModSpellDuration(), Creature::Regenerate(), Player::Regenerate(), RollMeleeOutcomeAgainst(), Player::UpdateEnergyRegen(), and Player::UpdateManaRegen().

◆ GetTotalAuraModValue()

float Unit::GetTotalAuraModValue ( UnitMods  unitMod) const
15420{
15421 if (unitMod >= UNIT_MOD_END)
15422 {
15423 LOG_ERROR("entities.unit", "attempt to access non-existing UnitMods in GetTotalAuraModValue()!");
15424 return 0.0f;
15425 }
15426
15427 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15428 return 0.0f;
15429
15430 float value = m_auraModifiersGroup[unitMod][BASE_VALUE];
15431 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15432 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE];
15433 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15434
15435 return value;
15436}

References BASE_PCT, BASE_VALUE, LOG_ERROR, m_auraModifiersGroup, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_END.

Referenced by Creature::UpdateArmor(), Creature::UpdateMaxHealth(), Creature::UpdateMaxPower(), and Creature::UpdateResistances().

◆ GetTotalAuraMultiplier()

float Unit::GetTotalAuraMultiplier ( AuraType  auratype) const
6021{
6022 float multiplier = 1.0f;
6023
6024 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6025 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6026 AddPct(multiplier, (*i)->GetAmount());
6027
6028 return multiplier;
6029}

References AddPct(), and GetAuraEffectsByType().

Referenced by MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), SpellCriticalHealingBonus(), and UpdateSpeed().

◆ GetTotalAuraMultiplierByAffectMask()

float Unit::GetTotalAuraMultiplierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6175{
6176 float multiplier = 1.0f;
6177
6178 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6179 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6180 if ((*i)->IsAffectedOnSpell(affectedSpell))
6181 AddPct(multiplier, (*i)->GetAmount());
6182
6183 return multiplier;
6184}

References AddPct(), and GetAuraEffectsByType().

◆ GetTotalAuraMultiplierByMiscMask()

float Unit::GetTotalAuraMultiplierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6071{
6072 float multiplier = 1.0f;
6073
6074 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6075 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6076 if (((*i)->GetMiscValue() & misc_mask))
6077 AddPct(multiplier, (*i)->GetAmount());
6078
6079 return multiplier;
6080}

References AddPct(), and GetAuraEffectsByType().

Referenced by CalculateAOEDamageReduction(), CalculateMeleeDamage(), MeleeDamageBonusTaken(), and SpellCriticalHealingBonus().

◆ GetTotalAuraMultiplierByMiscValue()

float Unit::GetTotalAuraMultiplierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6123{
6124 float multiplier = 1.0f;
6125
6126 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6127 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6128 if ((*i)->GetMiscValue() == misc_value)
6129 AddPct(multiplier, (*i)->GetAmount());
6130
6131 return multiplier;
6132}

References AddPct(), and GetAuraEffectsByType().

Referenced by Player::UpdateEnergyRegen(), and Player::UpdateManaRegen().

◆ GetTotalStatValue()

float Unit::GetTotalStatValue ( Stats  stat,
float  additionalValue = 0.0f 
) const
15404{
15405 UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_STAT_START) + stat);
15406
15407 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15408 return 0.0f;
15409
15410 // value = ((base_value * base_pct) + total_value) * total_pct
15411 float value = m_auraModifiersGroup[unitMod][BASE_VALUE] + GetCreateStat(stat);
15412 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15413 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE] + additionalValue;
15414 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15415
15416 return value;
15417}
UnitMods
Definition: Unit.h:143
@ UNIT_MOD_STAT_START
Definition: Unit.h:171
float GetCreateStat(Stats stat) const
Definition: Unit.h:1004

References BASE_PCT, BASE_VALUE, GetCreateStat(), m_auraModifiersGroup, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_STAT_START.

Referenced by Player::UpdateAllStats(), Guardian::UpdateStats(), and Player::UpdateStats().

◆ getTransForm()

◆ GetTransGUID()

◆ GetUnitBlockChance()

float Unit::GetUnitBlockChance ( ) const
3737{
3738 if (Player const* player = ToPlayer())
3739 {
3740 if (player->CanBlock())
3741 {
3742 Item* tmpitem = player->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
3743 if (tmpitem && !tmpitem->IsBroken() && tmpitem->GetTemplate()->Block)
3745 }
3746 // is player but has no block ability or no not broken shield equipped
3747 return 0.0f;
3748 }
3749 else
3750 {
3751 if (ToCreature()->IsTotem())
3752 return 0.0f;
3753 else
3754 {
3755 float block = 5.0f;
3757 return block > 0.0f ? block : 0.0f;
3758 }
3759 }
3760}
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition: SpellAuraDefines.h:114
@ PLAYER_BLOCK_PERCENTAGE
Definition: UpdateFields.h:346
@ EQUIPMENT_SLOT_OFFHAND
Definition: Player.h:687
#define INVENTORY_SLOT_BAG_0
Definition: Player.h:666
ItemTemplate const * GetTemplate() const
Definition: Item.cpp:544
bool IsBroken() const
Definition: Item.h:257
uint32 Block
Definition: ItemTemplate.h:674

References ItemTemplate::Block, EQUIPMENT_SLOT_OFFHAND, Object::GetFloatValue(), Item::GetTemplate(), GetTotalAuraModifier(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), IsTotem(), PLAYER_BLOCK_PERCENTAGE, SPELL_AURA_MOD_BLOCK_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitCriticalChance()

float Unit::GetUnitCriticalChance ( WeaponAttackType  attackType,
Unit const *  victim 
) const
3763{
3764 float crit;
3765
3766 if (IsPlayer())
3767 {
3768 switch (attackType)
3769 {
3770 case BASE_ATTACK:
3772 break;
3773 case OFF_ATTACK:
3775 break;
3776 case RANGED_ATTACK:
3778 break;
3779 // Just for good manner
3780 default:
3781 crit = 0.0f;
3782 break;
3783 }
3784 }
3785 else
3786 {
3787 crit = 5.0f;
3790 }
3791
3792 // flat aura mods
3793 if (attackType == RANGED_ATTACK)
3794 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE);
3795 else
3796 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE);
3797
3798 AuraEffectList const& mTotalAuraList = victim->GetAuraEffectsByType(SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER);
3799 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
3800 {
3801 if (GetGUID() != (*i)->GetCasterGUID())
3802 continue;
3803
3804 crit += (*i)->GetAmount();
3805 }
3806
3807 // reduce crit chance from Rating for players
3808 if (attackType != RANGED_ATTACK)
3809 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_MELEE);
3810 else
3811 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_RANGED);
3812
3813 // Apply crit chance from defence skill
3814 crit += (int32(GetMaxSkillValueForLevel(victim)) - int32(victim->GetDefenseSkillValue(this))) * 0.04f;
3815
3816 // xinef: SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE should be calculated at the end
3817 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
3818
3819 if (crit < 0.0f)
3820 crit = 0.0f;
3821 return crit;
3822}
@ SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER
Definition: SpellAuraDefines.h:371
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE
Definition: SpellAuraDefines.h:251
@ SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
Definition: SpellAuraDefines.h:260
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE
Definition: SpellAuraDefines.h:250
@ SPELL_AURA_MOD_CRIT_PCT
Definition: SpellAuraDefines.h:353
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
Definition: SpellAuraDefines.h:115
@ PLAYER_RANGED_CRIT_PERCENTAGE
Definition: UpdateFields.h:352
@ PLAYER_CRIT_PERCENTAGE
Definition: UpdateFields.h:351
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
Definition: UpdateFields.h:353
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition: Unit.h:1134

References ApplyResilience(), BASE_ATTACK, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, GetAuraEffectsByType(), GetDefenseSkillValue(), Object::GetFloatValue(), Object::GetGUID(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), Object::IsPlayer(), OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_MOD_CRIT_PCT, and SPELL_AURA_MOD_WEAPON_CRIT_PERCENT.

Referenced by spell_dk_wandering_plague_aura::CheckProc(), and RollMeleeOutcomeAgainst().

◆ GetUnitDodgeChance()

float Unit::GetUnitDodgeChance ( ) const
3675{
3676 if (IsPlayer())
3677 return ToPlayer()->GetRealDodge(); //GetFloatValue(PLAYER_DODGE_PERCENTAGE);
3678 else
3679 {
3680 if (ToCreature()->IsTotem())
3681 return 0.0f;
3682 else
3683 {
3684 float dodge = ToCreature()->isWorldBoss() ? 5.85f : 5.0f; // Xinef: bosses should have 6.5% dodge (5.9 + 0.6 from defense skill difference)
3686 return dodge > 0.0f ? dodge : 0.0f;
3687 }
3688 }
3689}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition: SpellAuraDefines.h:112
float GetRealDodge() const
Definition: Player.h:2610

References Player::GetRealDodge(), GetTotalAuraModifier(), Object::IsPlayer(), IsTotem(), Creature::isWorldBoss(), SPELL_AURA_MOD_DODGE_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitFlags()

◆ GetUnitFlags2()

UnitFlags2 Unit::GetUnitFlags2 ( ) const
inline

Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.

@ UNIT_FIELD_FLAGS_2
Definition: UpdateFields.h:118
UnitFlags2
Definition: UnitDefines.h:289

References Object::GetUInt32Value(), and UNIT_FIELD_FLAGS_2.

Referenced by npc_commandscript::HandleNpcInfoCommand().

◆ GetUnitMeleeSkill()

uint32 Unit::GetUnitMeleeSkill ( Unit const *  target = nullptr) const
inline
1116{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }

References GetLevel(), and getLevelForTarget().

Referenced by DealMeleeDamage(), GetDefenseSkillValue(), and GetWeaponSkillValue().

◆ GetUnitMissChance()

float Unit::GetUnitMissChance ( WeaponAttackType  attType) const
3722{
3723 float miss_chance = 5.00f;
3724
3725 if (Player const* player = ToPlayer())
3726 miss_chance += player->GetMissPercentageFromDefence();
3727
3728 if (attType == RANGED_ATTACK)
3730 else
3732
3733 return miss_chance;
3734}
@ SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE
Definition: SpellAuraDefines.h:247
@ SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE
Definition: SpellAuraDefines.h:248

References GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE, and Object::ToPlayer().

Referenced by MeleeSpellMissChance().

◆ GetUnitMovementFlags()

◆ GetUnitParryChance()

float Unit::GetUnitParryChance ( ) const
3692{
3693 float chance = 0.0f;
3694
3695 if (Player const* player = ToPlayer())
3696 {
3697 if (player->CanParry())
3698 {
3699 Item* tmpitem = player->GetWeaponForAttack(BASE_ATTACK, true);
3700 if (!tmpitem)
3701 tmpitem = player->GetWeaponForAttack(OFF_ATTACK, true);
3702
3703 if (tmpitem)
3704 chance = player->GetRealParry(); //GetFloatValue(PLAYER_PARRY_PERCENTAGE);
3705 }
3706 }
3707 else if (IsCreature())
3708 {
3709 if (ToCreature()->isWorldBoss())
3710 chance = 13.4f; // + 0.6 by skill diff
3712 chance = 5.0f;
3713
3714 // Xinef: if aura is present, type should not matter
3716 }
3717
3718 return chance > 0.0f ? chance : 0.0f;
3719}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition: SpellAuraDefines.h:110

References BASE_ATTACK, CREATURE_TYPE_HUMANOID, GetCreatureType(), GetTotalAuraModifier(), Object::IsCreature(), OFF_ATTACK, SPELL_AURA_MOD_PARRY_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by spell_dk_spell_deflection::Absorb(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitState()

uint32 Unit::GetUnitState ( ) const
inline

◆ GetUnitTypeMask()

uint32 Unit::GetUnitTypeMask ( ) const
inline
698{ return m_unitTypeMask; }

References m_unitTypeMask.

◆ GetVehicle()

Vehicle * Unit::GetVehicle ( ) const
inline
1842{ return m_vehicle; }

References m_vehicle.

Referenced by KillRewarder::_InitXP(), Vehicle::AddPassenger(), WorldSession::BuildPartyMemberStatsChangedPacket(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::CanAIAttack(), npc_raging_spirit::npc_raging_spiritAI::CanAIAttack(), npc_icc_lk_checktarget::npc_icc_lk_checktargetAI::CanAIAttack(), boss_flame_leviathan_defense_turret::boss_flame_leviathan_defense_turretAI::CanAIAttack(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::CheckAchievementCriteriaMeet(), Spell::CheckCast(), Spell::EffectJumpDest(), Spell::EffectKnockBack(), CreatureAI::EnterEvadeMode(), GetDirectTransport(), SmartScript::GetTargets(), GetTransGUID(), WorldSession::HandleAttackSwingOpcode(), WorldSession::HandleChangeSeatsOnControlledVehicle(), spell_switch_infragreen_bomber_station::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), Player::IsPetNeedBeTemporaryUnsummoned(), npc_nexus_lord::npc_nexus_lordAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), achievement_flame_leviathan_garage::OnCheck(), achievement_wg_didnt_stand_a_chance::OnCheck(), npc_announcer_toc5::OnGossipHello(), BattlefieldWG::OnPlayerLeaveWar(), boss_flame_leviathan_overload_device::boss_flame_leviathan_overload_deviceAI::OnSpellClick(), VehicleCheck::operator()(), OutDebugInfo(), Player::ProcessDelayedOperations(), Player::ProcessTerrainStatusUpdate(), Vehicle::RemovePassenger(), Creature::SelectVictim(), SetControlled(), Player::SetViewpoint(), lfg::LFGMgr::TeleportPlayer(), npc_pilgrims_bounty_chair::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_impaling_spear::npc_impaling_spearAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdatePosition(), UpdateSpeed(), GameObject::Use(), Acore::MessageDistDeliverer::Visit(), and Acore::MessageDistDelivererToHostile::Visit().

◆ GetVehicleBase()

◆ GetVehicleCreatureBase()

◆ GetVehicleKit()

Vehicle * Unit::GetVehicleKit ( ) const
inline
1841{ return m_vehicleKit; }

References m_vehicleKit.

Referenced by _EnterVehicle(), Creature::AddToWorld(), Creature::AIM_Initialize(), boss_xt002::boss_xt002AI::AttachHeart(), npc_salvaged_siege_engine::BeforeSpellClick(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::boss_deathbringer_saurfangAI(), Object::BuildMovementUpdate(), spell_igb_cannon_blast::CalculatePower(), Aura::CanStackWith(), spell_demolisher_ride_vehicle::CheckCast(), SmartAI::CheckConditions(), VehicleAI::CheckConditions(), Map::CreatureRelocation(), MotionTransport::DelayedTeleportTransport(), Dismount(), npc_orb_carrier::npc_orb_carrierAI::DoAction(), npc_ulduar_vx001::npc_ulduar_vx001AI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), Spell::EffectTeleportUnits(), CreatureAI::EnterEvadeMode(), boss_ick::boss_ickAI::GetKrick(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::GetS3(), SmartScript::GetTargets(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraSetVehicle(), WorldSession::HandleCastSpellOpcode(), spell_q13280_13283_plant_battle_standard::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_q12919_gymers_throw::HandleScript(), HandleSpellClick(), IsOnVehicle(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), boss_gormok::boss_gormokAI::JustEngagedWith(), Mount(), npc_hover_disk::npc_hover_diskAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::MovementInform(), npc_vics_flying_machine::npc_vics_flying_machineAI::MovementInform(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::npc_high_overlord_saurfangAI(), npc_orb_carrier::npc_orb_carrierAI::npc_orb_carrierAI(), spell_systems_shutdown_aura::OnApply(), VehicleAI::OnCharmed(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), FlameLeviathanPursuedTargetSelector::operator()(), OutDebugInfo(), npc_wintergarde_gryphon::PassengerBoarded(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), Map::PlayerRelocation(), SmartScript::ProcessAction(), boss_skadi_grauf::boss_skadi_graufAI::RemoveSkadi(), Spell::SelectImplicitCasterObjectTargets(), SmartAI::SmartAI(), npc_wintergarde_gryphon::SpellHit(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), boss_flame_leviathan::boss_flame_leviathanAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::SpreadFire(), boss_gormok::boss_gormokAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_siege_machine::npc_wg_siege_machineAI::UpdateAI(), UpdateHeight(), and UpdateOrientation().

◆ GetVictim()

Unit * Unit::GetVictim ( ) const
inline
850{ return m_attacking; }

References m_attacking.

Referenced by boss_marli::_chargePlayer(), PetAI::_needToStop(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), SmartAI::AssistPlayerInCombatAgainst(), Attack(), PetAI::AttackedBy(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), boss_malygos::boss_malygosAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), Object::BuildMovementUpdate(), Creature::CallAssistance(), Creature::CallForHelp(), TurretAI::CanAIAttack(), PetAI::CanAttack(), boss_attumen::CanMeleeHit(), boss_midnight::CanMeleeHit(), boss_swamplord_muselek::CanShootVictim(), Spell::CheckCast(), boss_mandokir::boss_mandokirAI::DamageDealt(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_leotheras_the_blind::DemonTime(), SmartAI::DistanceYourself(), boss_sacrolash::DoAction(), boss_alythess::DoAction(), boss_skadi::boss_skadiAI::DoAction(), UnitAI::DoCast(), UnitAI::DoCastVictim(), ConfusedMovementGenerator< T >::DoFinalize(), Creature::DoFleeToGetAssistance(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), ScriptedAI::DoStopAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectTaunt(), boss_ouro::Emerge(), AssistDelayEvent::Execute(), RestoreAttack::Execute(), StartMovementEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::ExecuteEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::ExecuteEvent(), emerald_dragonAI::ExecuteEvent(), spell_shazzrah_gate_dummy::FilterTargets(), spell_malchezaar_enfeeble::FilterTargets(), spell_chain_burn::FilterTargets(), spell_morogrim_tidewalker_watery_grave::FilterTargets(), TimedFleeingMovementGenerator::Finalize(), getAttackerForHelper(), ThreatMgr::GetCurrentVictim(), Player::GetInitialVisiblePackets(), CreatureGroup::GetNewTargetForMember(), SmartScript::GetTargets(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), cast_commandscript::HandleCastTargetCommad(), spell_aggro_drones::HandleDummy(), spell_gen_threshalisk_charge::HandleDummy(), HandleDummyAuraProc(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_lurker_below_spout::HandleEffectRemove(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), AuraEffect::HandleModPossessPet(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandleSetRaidDifficultyOpcode(), ChaseMovementGenerator< T >::HasLostTarget(), Spell::InitExplicitTargets(), RotateMovementGenerator::Initialize(), IsMutualChase(), boss_ouro::IsPlayerWithinMeleeRange(), npc_pet_dk_ghoul::IsSummonedBy(), npc_pet_dk_army_of_the_dead::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), npc_malchezaar_axe::JustEngagedWith(), boss_akilzon::JustEngagedWith(), boss_zuljin::JustEngagedWith(), npc_zealot_zath::JustEngagedWith(), npc_yor::JustEngagedWith(), npc_flame_of_azzinoth::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nethermancer_sepethrea::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_sacrolash::JustEngagedWith(), boss_alythess::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), boss_vem::JustEngagedWith(), boss_veklor::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_midnight::JustSummoned(), boss_nightbane::JustSummoned(), boss_halazzi::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), boss_the_black_stalker::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), npc_emily::npc_emilyAI::JustSummoned(), PetAI::KilledUnit(), boss_ick::boss_ickAI::KilledUnit(), boss_flame_leviathan::boss_flame_leviathanAI::KilledUnit(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), CreatureGroup::MemberEngagingTarget(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), npc_kerlonian::npc_kerlonianAI::MoveInLineOfSight(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_ringo::npc_ringoAI::MoveInLineOfSight(), boss_gluth::boss_gluthAI::MoveInLineOfSight(), npc_future_you::npc_future_youAI::MoveInLineOfSight(), npc_captain_saeed::npc_captain_saeedAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), boss_nightbane::MovementInform(), boss_bug_trio::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), boss_felmyst::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_kagani_nightstrike::MovementInform(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), NecroticPlagueTargetCheck::operator()(), NonTankTargetSelector::operator()(), VampiricBiteTargetSelector::operator()(), BoneStormMoveTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::operator()(), UnboundPlagueTargetSelector::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), boss_nefarian::PathEndReached(), SmartScript::ProcessEvent(), SmartScript::ProcessEventsFor(), SmartScript::ProcessTimedAction(), boss_grobbulus::boss_grobbulusAI::PullChamberAdds(), Creature::ReleaseFocus(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_pet_hunter_snake_trap::Reset(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), Resurrect(), boss_kiljaeden::ScheduleBasicAbilities(), npc_sunblade_scout::ScheduleCombat(), npc_amanishi_scout::ScheduleCombat(), boss_taldaram::ScheduleCombatEvents(), boss_magtheridon::ScheduleCombatEvents(), npc_thaladred::ScheduleEvents(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), npc_giant_claw_tentacle::ScheduleTasks(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), PetAI::SelectNextTarget(), SmartAI::SetCombatMovement(), SetConfused(), SmartAI::SetCurrentRangeMode(), SetFeared(), SetStunned(), boss_murmur::ShouldCastResonance(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), npc_escortAI::Start(), FollowerAI::StartFollow(), StopAttackFaction(), StopAttackingInvalidTarget(), SummonCroneIfReady(), boss_akilzon::SummonEagles(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_dorothee::SummonTito(), TauntApply(), TauntFadeOut(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Pet::Update(), Creature::Update(), Player::Update(), CasterAI::UpdateAI(), ArcherAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_general_angerforge::boss_general_angerforgeAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_broodlord::boss_broodlordAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_muglash::npc_muglashAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), npc_azure_invader::npc_azure_invaderAI::UpdateAI(), npc_azure_raider::npc_azure_raiderAI::UpdateAI(), npc_azure_captain::npc_azure_captainAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), guard_shattrath_scryer::guard_shattrath_scryerAI::UpdateAI(), guard_shattrath_aldor::guard_shattrath_aldorAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), PossessedAI::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_dark_fiend::UpdateAI(), npc_zuljin_vortex::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), npc_pet_gen_gnomish_flame_turret::UpdateAI(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), Player::UpdateFFAPvPFlag(), Player::UpdateFFAPvPState(), SmartAI::UpdatePath(), boss_netherspite::UpdatePortals(), CreatureAI::UpdateVictim(), CreatureAI::UpdateVictimWithGaze(), and boss_hexlord_malacrass::UseAbility().

◆ GetVirtualItemId()

uint32 Unit::GetVirtualItemId ( uint32  slot) const
21028{
21029 if (slot >= MAX_EQUIPMENT_ITEMS)
21030 return 0;
21031
21033}
@ UNIT_VIRTUAL_ITEM_SLOT_ID
Definition: UpdateFields.h:116
#define MAX_EQUIPMENT_ITEMS
Definition: CreatureData.h:35

References Object::GetUInt32Value(), MAX_EQUIPMENT_ITEMS, and UNIT_VIRTUAL_ITEM_SLOT_ID.

◆ GetVisibleAura()

AuraApplication * Unit::GetVisibleAura ( uint8  slot)
inline
1462 {
1463 VisibleAuraMap::iterator itr = m_visibleAuras.find(slot);
1464 if (itr != m_visibleAuras.end())
1465 return itr->second;
1466 return nullptr;
1467 }

References m_visibleAuras.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), AuraApplication::BuildUpdatePacket(), and WorldSession::HandleRequestPartyMemberStatsOpcode().

◆ GetVisibleAuras()

◆ GetWeaponDamageRange()

float Unit::GetWeaponDamageRange ( WeaponAttackType  attType,
WeaponDamageRange  type,
uint8  damageIndex = 0 
) const
15554{
15555 if (attType == OFF_ATTACK && !HasOffhandWeaponForAttack())
15556 return 0.0f;
15557
15558 return m_weaponDamage[attType][type][damageIndex];
15559}

References HasOffhandWeaponForAttack(), m_weaponDamage, and OFF_ATTACK.

Referenced by Player::_ApplyWeaponDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and Guardian::UpdateDamagePhysical().

◆ GetWeaponProcChance()

float Unit::GetWeaponProcChance ( ) const
13535{
13536 // normalized proc chance for weapon attack speed
13537 // (odd formula...)
13539 return (GetAttackTime(BASE_ATTACK) * 1.8f / 1000.0f);
13541 return (GetAttackTime(OFF_ATTACK) * 1.6f / 1000.0f);
13542 return 0;
13543}

References BASE_ATTACK, GetAttackTime(), HasOffhandWeaponForAttack(), isAttackReady(), and OFF_ATTACK.

Referenced by Player::CastItemCombatSpell().

◆ GetWeaponSkillValue()

uint32 Unit::GetWeaponSkillValue ( WeaponAttackType  attType,
Unit const *  target = nullptr 
) const
3825{
3826 uint32 value = 0;
3827 if (Player const* player = ToPlayer())
3828 {
3829 Item* item = player->GetWeaponForAttack(attType, true);
3830
3831 // feral or unarmed skill only for base attack
3832 if (attType != BASE_ATTACK && !item)
3833 return 0;
3834
3835 if (IsInFeralForm())
3836 return GetMaxSkillValueForLevel(); // always maximized SKILL_FERAL_COMBAT in fact
3837
3838 // weapon skill or (unarmed for base attack)
3839 uint32 skill = SKILL_UNARMED;
3840 if (item)
3841 skill = item->GetSkill();
3842
3843 // in PvP use full skill instead current skill value
3844 value = (target && target->IsControlledByPlayer())
3845 ? player->GetMaxSkillValue(skill)
3846 : player->GetSkillValue(skill);
3847 // Modify value from ratings
3848 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL));
3849 switch (attType)
3850 {
3851 case BASE_ATTACK:
3852 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_MAINHAND));
3853 break;
3854 case OFF_ATTACK:
3855 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_OFFHAND));
3856 break;
3857 case RANGED_ATTACK:
3858 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_RANGED));
3859 break;
3860 default:
3861 break;
3862 }
3863 }
3864 else
3865 value = GetUnitMeleeSkill(target);
3866 return value;
3867}
@ CR_WEAPON_SKILL_RANGED
Definition: Unit.h:240
@ CR_WEAPON_SKILL
Definition: Unit.h:218
@ CR_WEAPON_SKILL_OFFHAND
Definition: Unit.h:239
@ CR_WEAPON_SKILL_MAINHAND
Definition: Unit.h:238
@ SKILL_UNARMED
Definition: SharedDefines.h:3157
uint32 GetSkill()
Definition: Item.cpp:555
bool IsInFeralForm() const
Definition: Unit.h:1876

References BASE_ATTACK, CR_WEAPON_SKILL, CR_WEAPON_SKILL_MAINHAND, CR_WEAPON_SKILL_OFFHAND, CR_WEAPON_SKILL_RANGED, GetMaxSkillValueForLevel(), Item::GetSkill(), GetUnitMeleeSkill(), IsControlledByPlayer(), IsInFeralForm(), OFF_ATTACK, RANGED_ATTACK, SKILL_UNARMED, and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), and Player::UpdateCritPercentage().

◆ HandleAuraProc()

bool Unit::HandleAuraProc ( Unit victim,
uint32  damage,
Aura triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
bool *  handled 
)
private
8812{
8813 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
8814
8815 switch (dummySpell->SpellFamilyName)
8816 {
8818 switch (dummySpell->Id)
8819 {
8820 // Nevermelting Ice Crystal
8821 case 71564:
8822 RemoveAuraFromStack(71564);
8823 *handled = true;
8824 break;
8825 // Gaseous Bloat
8826 case 70672:
8827 case 72455:
8828 case 72832:
8829 case 72833:
8830 {
8831 if (Unit* caster = triggeredByAura->GetCaster())
8832 if (victim && caster->GetGUID() == victim->GetGUID())
8833 {
8834 *handled = true;
8835 uint32 stack = triggeredByAura->GetStackAmount();
8836 int32 const mod = (GetMap()->GetSpawnMode() & 1) ? 1500 : 1250;
8837 int32 dmg = 0;
8838 for (uint8 i = 1; i <= stack; ++i)
8839 dmg += mod * i;
8840 caster->CastCustomSpell(70701, SPELLVALUE_BASE_POINT0, dmg);
8841 }
8842 break;
8843 }
8844 // Ball of Flames Proc
8845 case 71756:
8846 case 72782:
8847 case 72783:
8848 case 72784:
8849 RemoveAuraFromStack(dummySpell->Id);
8850 *handled = true;
8851 break;
8852 // Discerning Eye of the Beast
8853 case 59915:
8854 {
8855 CastSpell(this, 59914, true); // 59914 already has correct basepoints in DBC, no need for custom bp
8856 *handled = true;
8857 break;
8858 }
8859 // Swift Hand of Justice
8860 case 59906:
8861 {
8862 int32 bp0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_0]. CalcValue());
8863 CastCustomSpell(this, 59913, &bp0, nullptr, nullptr, true);
8864 *handled = true;
8865 break;
8866 }
8867 }
8868
8869 break;
8870 case SPELLFAMILY_MAGE:
8871 {
8872 // Combustion
8873 switch (dummySpell->Id)
8874 {
8875 case 11129:
8876 {
8877 *handled = true;
8878 Unit* caster = triggeredByAura->GetCaster();
8879 if (!caster || !damage)
8880 return false;
8881
8882 // last charge and crit
8883 if (triggeredByAura->GetCharges() <= 1 && (procEx & PROC_EX_CRITICAL_HIT))
8884 return true; // charge counting (will removed)
8885
8886 CastSpell(this, 28682, true);
8887
8888 return procEx & PROC_EX_CRITICAL_HIT;
8889 }
8890 // Empowered Fire
8891 case 31656:
8892 case 31657:
8893 case 31658:
8894 {
8895 *handled = true;
8896
8897 SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(67545);
8898 if (!spInfo)
8899 return false;
8900
8901 int32 bp0 = int32(CalculatePct(GetMaxPower(POWER_MANA), spInfo->Effects[0].CalcValue()));
8902 CastCustomSpell(this, 67545, &bp0, nullptr, nullptr, true, nullptr, triggeredByAura->GetEffect(EFFECT_0), GetGUID());
8903 return true;
8904 }
8905 }
8906 break;
8907 }
8909 {
8910 // Blood of the North
8911 // Reaping
8912 // Death Rune Mastery
8913 // xinef: Icon 22 is used for item bonus, skip
8914 if (dummySpell->SpellIconID == 3041 || (dummySpell->SpellIconID == 22 && dummySpell->Id != 62459) || dummySpell->SpellIconID == 2622)
8915 {
8916 *handled = true;
8917 // Convert recently used Blood Rune to Death Rune
8918 if (Player* player = ToPlayer())
8919 {
8920 if (!player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
8921 return false;
8922
8923 // xinef: not true
8924 //RuneType rune = ToPlayer()->GetLastUsedRune();
8925 // can't proc from death rune use
8926 //if (rune == RUNE_DEATH)
8927 // return false;
8928 AuraEffect* aurEff = triggeredByAura->GetEffect(EFFECT_0);
8929 if (!aurEff)
8930 return false;
8931
8932 // Reset amplitude - set death rune remove timer to 30s
8933 aurEff->ResetPeriodic(true);
8934 uint32 runesLeft;
8935
8936 if (dummySpell->SpellIconID == 2622)
8937 runesLeft = 2;
8938 else
8939 runesLeft = 1;
8940
8941 for (uint8 i = 0; i < MAX_RUNES && runesLeft; ++i)
8942 {
8943 if (dummySpell->SpellIconID == 2622)
8944 {
8945 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8946 player->GetBaseRune(i) == RUNE_BLOOD)
8947 continue;
8948 }
8949 else
8950 {
8951 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8952 player->GetBaseRune(i) != RUNE_BLOOD)
8953 continue;
8954 }
8955 if (player->GetRuneCooldown(i) != player->GetRuneBaseCooldown(i, false))
8956 continue;
8957
8958 --runesLeft;
8959 // Mark aura as used
8960 player->AddRuneByAuraEffect(i, RUNE_DEATH, aurEff);
8961 }
8962 return true;
8963 }
8964 return false;
8965 }
8966 break;
8967 }
8969 {
8970 switch (dummySpell->Id)
8971 {
8972 // Item - Warrior T10 Protection 4P Bonus
8973 case 70844:
8974 {
8975 int32 basepoints0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_1]. CalcValue());
8976 CastCustomSpell(this, 70845, &basepoints0, nullptr, nullptr, true);
8977 break;
8978 }
8979 default:
8980 break;
8981 }
8982 break;
8983 }
8984 case SPELLFAMILY_SHAMAN:
8985 {
8986 // Flurry
8987 if ((dummySpell->SpellFamilyFlags[1] & 0x00000200) != 0)
8988 {
8989 if (cooldown)
8990 {
8991 if (HasSpellCooldown(dummySpell->Id))
8992 {
8993 *handled = true;
8994 break;
8995 }
8996
8997 AddSpellCooldown(dummySpell->Id, 0, cooldown);
8998 }
8999 }
9000 break;
9001 }
9002 }
9003 return false;
9004}
@ RUNE_DEATH
Definition: Player.h:407
@ RUNE_BLOOD
Definition: Player.h:404
@ EFFECT_1
Definition: SharedDefines.h:32
@ SPELLFAMILY_MAGE
Definition: SharedDefines.h:3797
@ SPELLFAMILY_GENERIC
Definition: SharedDefines.h:3794
@ SPELLFAMILY_WARRIOR
Definition: SharedDefines.h:3798
@ SPELLFAMILY_SHAMAN
Definition: SharedDefines.h:3805
@ SPELLFAMILY_DEATHKNIGHT
Definition: SharedDefines.h:3809
virtual bool HasSpellCooldown(uint32) const
Definition: Unit.h:1264
virtual void AddSpellCooldown(uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition: Unit.h:1266
void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4990
uint8 GetSpawnMode() const
Definition: Map.h:267
void ResetPeriodic(bool resetPeriodicTimer=false)
Definition: SpellAuraEffects.h:89
AuraEffect * GetEffect(uint8 effIndex) const
Definition: SpellAuras.h:175

References AddSpellCooldown(), CalculatePct(), CastCustomSpell(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, EFFECT_0, EFFECT_1, SpellInfo::Effects, Aura::GetCaster(), Aura::GetCharges(), Aura::GetEffect(), Object::GetGUID(), WorldObject::GetMap(), GetMaxHealth(), GetMaxPower(), Map::GetSpawnMode(), Aura::GetSpellInfo(), Aura::GetStackAmount(), HasSpellCooldown(), SpellInfo::Id, MAX_RUNES, POWER_MANA, PROC_EX_CRITICAL_HIT, RemoveAuraFromStack(), AuraEffect::ResetPeriodic(), RUNE_BLOOD, RUNE_DEATH, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_GENERIC, SPELLFAMILY_MAGE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromCharge()

bool Unit::HandleAuraRaidProcFromCharge ( AuraEffect triggeredByAura)
private
17749{
17750 // aura can be deleted at casts
17751 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17752
17753 uint32 damageSpellId;
17754 switch (spellProto->Id)
17755 {
17756 case 57949: // shiver
17757 damageSpellId = 57952;
17758 //animationSpellId = 57951; dummy effects for jump spell have unknown use (see also 41637)
17759 break;
17760 case 59978: // shiver
17761 damageSpellId = 59979;
17762 break;
17763 case 43593: // Cold Stare
17764 damageSpellId = 43594;
17765 break;
17766 default:
17767 LOG_ERROR("entities.unit", "Unit::HandleAuraRaidProcFromCharge, received unhandled spell: {}", spellProto->Id);
17768 return false;
17769 }
17770
17771 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17772
17773 // jumps
17774 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17775
17776 // current aura expire
17777 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17778
17779 // next target selection
17780 if (jumps > 0)
17781 {
17782 if (Unit* caster = triggeredByAura->GetCaster())
17783 {
17784 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17785 if (Unit* target = GetNextRandomRaidMemberOrPet(radius))
17786 {
17787 CastSpell(target, spellProto, true, nullptr, triggeredByAura, caster_guid);
17788 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17789 aura->SetCharges(jumps);
17790 }
17791 }
17792 }
17793
17794 CastSpell(this, damageSpellId, true, nullptr, triggeredByAura, caster_guid);
17795
17796 return true;
17797}
Unit * GetNextRandomRaidMemberOrPet(float radius)
Definition: Unit.cpp:11209
void SetCharges(uint8 charges)
Definition: SpellAuras.cpp:952

References CastSpell(), SpellInfo::Effects, AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), GetNextRandomRaidMemberOrPet(), AuraEffect::GetSpellInfo(), SpellInfo::Id, LOG_ERROR, and Aura::SetCharges().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromChargeWithValue()

bool Unit::HandleAuraRaidProcFromChargeWithValue ( AuraEffect triggeredByAura)
private
17660{
17661 // aura can be deleted at casts
17662 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17663 int32 heal = triggeredByAura->GetAmount();
17664 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17665
17666 // Currently only Prayer of Mending
17667 if (!(spellProto->SpellFamilyName == SPELLFAMILY_PRIEST && spellProto->SpellFamilyFlags[1] & 0x20))
17668 {
17669 LOG_DEBUG("spells.aura", "Unit::HandleAuraRaidProcFromChargeWithValue, received not handled spell: {}", spellProto->Id);
17670 return false;
17671 }
17672
17673 // jumps
17674 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17675
17676 // current aura expire
17677 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17678
17679 // next target selection
17680 if (jumps > 0)
17681 {
17682 if (Unit* caster = triggeredByAura->GetCaster())
17683 {
17684 // smart healing
17685 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17686 std::list<Unit*> nearMembers;
17687
17688 Player* player = nullptr;
17689 if (IsPlayer())
17690 player = ToPlayer();
17691 else if (GetOwner())
17692 player = GetOwner()->ToPlayer();
17693
17694 if (player)
17695 {
17696 Group* group = player->GetGroup();
17697 if (!group)
17698 {
17699 if (player != this)
17700 {
17701 if (IsWithinDistInMap(player, radius))
17702 nearMembers.push_back(player);
17703 }
17704 else if (Unit* pet = GetGuardianPet())
17705 {
17706 if (IsWithinDistInMap(pet, radius))
17707 nearMembers.push_back(pet);
17708 }
17709 }
17710 else
17711 {
17712 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
17713 if (Player* Target = itr->GetSource())
17714 {
17715 if (Target != this && !IsWithinDistInMap(Target, radius))
17716 continue;
17717
17718 // IsHostileTo check duel and controlled by enemy
17719 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
17720 nearMembers.push_back(Target);
17721
17722 // Push player's pet to vector
17723 if (Unit* pet = Target->GetGuardianPet())
17724 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
17725 nearMembers.push_back(pet);
17726 }
17727 }
17728
17729 if (!nearMembers.empty())
17730 {
17731 nearMembers.sort(Acore::HealthPctOrderPred());
17732 if (Unit* target = nearMembers.front())
17733 {
17734 CastSpell(target, 41637 /*Dummy visual effect triggered by main spell cast*/, true);
17735 CastCustomSpell(target, spellProto->Id, &heal, nullptr, nullptr, true, nullptr, triggeredByAura, caster_guid);
17736 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17737 aura->SetCharges(jumps);
17738 }
17739 }
17740 }
17741 }
17742 }
17743
17744 // heal
17745 CastCustomSpell(this, 33110, &heal, nullptr, nullptr, true, nullptr, nullptr, caster_guid);
17746 return true;
17747}
@ SPELLFAMILY_PRIEST
Definition: SharedDefines.h:3800
Definition: Unit.h:2213

References CastCustomSpell(), CastSpell(), SpellInfo::Effects, AuraEffect::GetAmount(), AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), GetOwner(), AuraEffect::GetSpellInfo(), SpellInfo::Id, IsHostileTo(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), LOG_DEBUG, GroupReference::next(), Aura::SetCharges(), SPELLFAMILY_PRIEST, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleDummyAuraProc()

bool Unit::HandleDummyAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
ProcEventInfo const &  eventInfo 
)
private
Todo:
: It should be moved to database, shouldn't it?
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
Todo:
: need more info (cooldowns/PPM)
6686{
6687 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
6688 uint32 effIndex = triggeredByAura->GetEffIndex();
6689 int32 triggerAmount = triggeredByAura->GetAmount();
6690 Spell const* spellProc = eventInfo.GetProcSpell();
6691
6692 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
6693 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
6694
6695 uint32 triggered_spell_id = 0;
6696 uint32 cooldown_spell_id = 0; // for random trigger, will be one of the triggered spell to avoid repeatable triggers
6697 // otherwise, it's the triggered_spell_id by default
6698 Unit* target = victim;
6699 int32 basepoints0 = 0;
6700 ObjectGuid originalCaster;
6701
6702 switch (dummySpell->SpellFamilyName)
6703 {
6705 {
6706 switch (dummySpell->Id)
6707 {
6708 // Overkill
6709 case 58426:
6710 {
6711 triggered_spell_id = 58427;
6712 break;
6713 }
6714 // Unstable Power
6715 case 24658:
6716 {
6717 if (!procSpell || procSpell->Id == 24659)
6718 return false;
6719 // Need remove one 24659 aura
6720 RemoveAuraFromStack(24659);
6721 return true;
6722 }
6723 // Restless Strength
6724 case 24661:
6725 {
6726 // Need remove one 24662 aura
6727 RemoveAuraFromStack(24662);
6728 return true;
6729 }
6730 // Mark of Malice
6731 case 33493:
6732 {
6733 if (triggeredByAura->GetBase()->GetCharges() > 1)
6734 return true;
6735
6736 target = this;
6737 triggered_spell_id = 33494;
6738 break;
6739 }
6740 // Twisted Reflection (boss spell)
6741 case 21063:
6742 triggered_spell_id = 21064;
6743 break;
6744 // Vampiric Aura (boss spell)
6745 case 38196:
6746 {
6747 basepoints0 = 3 * damage; // 300%
6748 if (basepoints0 < 0)
6749 return false;
6750
6751 triggered_spell_id = 31285;
6752 target = this;
6753 break;
6754 }
6755 // Aura of Madness (Darkmoon Card: Madness trinket)
6756 //=====================================================
6757 // 39511 Sociopath: +35 strength (Paladin, Rogue, Druid, Warrior)
6758 // 40997 Delusional: +70 attack power (Rogue, Hunter, Paladin, Warrior, Druid)
6759 // 40998 Kleptomania: +35 agility (Warrior, Rogue, Paladin, Hunter, Druid)
6760 // 40999 Megalomania: +41 damage/healing (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6761 // 41002 Paranoia: +35 spell/melee/ranged crit strike rating (All classes)
6762 // 41005 Manic: +35 haste (spell, melee and ranged) (All classes)
6763 // 41009 Narcissism: +35 intellect (Druid, Shaman, Priest, Warlock, Mage, Paladin, Hunter)
6764 // 41011 Martyr Complex: +35 stamina (All classes)
6765 // 41406 Dementia: Every 5 seconds either gives you +5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6766 // 41409 Dementia: Every 5 seconds either gives you -5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6767 case 39446:
6768 {
6769 if (!IsPlayer() || !IsAlive())
6770 return false;
6771
6772 // Select class defined buff
6773 switch (getClass())
6774 {
6775 case CLASS_PALADIN: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6776 case CLASS_DRUID: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6777 triggered_spell_id = RAND(39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409);
6778 cooldown_spell_id = 39511;
6779 break;
6780 case CLASS_ROGUE: // 39511, 40997, 40998, 41002, 41005, 41011
6781 case CLASS_WARRIOR: // 39511, 40997, 40998, 41002, 41005, 41011
6782 case CLASS_DEATH_KNIGHT:
6783 triggered_spell_id = RAND(39511, 40997, 40998, 41002, 41005, 41011);
6784 cooldown_spell_id = 39511;
6785 break;
6786 case CLASS_PRIEST: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6787 case CLASS_SHAMAN: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6788 case CLASS_MAGE: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6789 case CLASS_WARLOCK: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6790 triggered_spell_id = RAND(40999, 41002, 41005, 41009, 41011, 41406, 41409);
6791 cooldown_spell_id = 40999;
6792 break;
6793 case CLASS_HUNTER: // 40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409
6794 triggered_spell_id = RAND(40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409);
6795 cooldown_spell_id = 40997;
6796 break;
6797 default:
6798 return false;
6799 }
6800
6801 target = this;
6802 if (roll_chance_i(10))
6803 ToPlayer()->Say("This is Madness!", LANG_UNIVERSAL);
6804 break;
6805 }
6806 // Sunwell Exalted Caster Neck (??? neck)
6807 // cast ??? Light's Wrath if Exalted by Aldor
6808 // cast ??? Arcane Bolt if Exalted by Scryers
6809 case 46569:
6810 return false; // old unused version
6811 // Sunwell Exalted Caster Neck (Shattered Sun Pendant of Acumen neck)
6812 // cast 45479 Light's Wrath if Exalted by Aldor
6813 // cast 45429 Arcane Bolt if Exalted by Scryers
6814 case 45481:
6815 {
6816 Player* player = ToPlayer();
6817 if (!player)
6818 return false;
6819
6820 // Get Aldor reputation rank
6821 if (player->GetReputationRank(932) == REP_EXALTED)
6822 {
6823 target = this;
6824 triggered_spell_id = 45479;
6825 break;
6826 }
6827 // Get Scryers reputation rank
6828 if (player->GetReputationRank(934) == REP_EXALTED)
6829 {
6830 // triggered at positive/self casts also, current attack target used then
6831 if (target && IsFriendlyTo(target))
6832 {
6833 target = GetVictim();
6834 if (!target)
6835 {
6836 target = player->GetSelectedUnit();
6837 if (!target)
6838 return false;
6839 }
6840 if (IsFriendlyTo(target))
6841 return false;
6842 }
6843
6844 triggered_spell_id = 45429;
6845 break;
6846 }
6847 return false;
6848 }
6849 // Sunwell Exalted Melee Neck (Shattered Sun Pendant of Might neck)
6850 // cast 45480 Light's Strength if Exalted by Aldor
6851 // cast 45428 Arcane Strike if Exalted by Scryers
6852 case 45482:
6853 {
6854 if (!IsPlayer())
6855 return false;
6856
6857 // Get Aldor reputation rank
6858 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6859 {
6860 target = this;
6861 triggered_spell_id = 45480;
6862 break;
6863 }
6864 // Get Scryers reputation rank
6865 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6866 {
6867 triggered_spell_id = 45428;
6868 break;
6869 }
6870 return false;
6871 }
6872 // Sunwell Exalted Tank Neck (Shattered Sun Pendant of Resolve neck)
6873 // cast 45431 Arcane Insight if Exalted by Aldor
6874 // cast 45432 Light's Ward if Exalted by Scryers
6875 case 45483:
6876 {
6877 if (!IsPlayer())
6878 return false;
6879
6880 // Get Aldor reputation rank
6881 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6882 {
6883 target = this;
6884 triggered_spell_id = 45432;
6885 break;
6886 }
6887 // Get Scryers reputation rank
6888 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6889 {
6890 target = this;
6891 triggered_spell_id = 45431;
6892 break;
6893 }
6894 return false;
6895 }
6896 // Sunwell Exalted Healer Neck (Shattered Sun Pendant of Restoration neck)
6897 // cast 45478 Light's Salvation if Exalted by Aldor
6898 // cast 45430 Arcane Surge if Exalted by Scryers
6899 case 45484:
6900 {
6901 if (!IsPlayer())
6902 return false;
6903
6904 // Get Aldor reputation rank
6905 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6906 {
6907 target = this;
6908 triggered_spell_id = 45478;
6909 break;
6910 }
6911 // Get Scryers reputation rank
6912 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6913 {
6914 triggered_spell_id = 45430;
6915 break;
6916 }
6917 return false;
6918 }
6919 // Kill command
6920 case 58914:
6921 {
6922 // Remove aura stack from pet
6923 RemoveAuraFromStack(58914);
6924 Unit* owner = GetOwner();
6925 if (!owner)
6926 return true;
6927 // reduce the owner's aura stack
6928 owner->RemoveAuraFromStack(34027);
6929 return true;
6930 }
6931 // Vampiric Touch (generic, used by some boss)
6932 case 52723:
6933 case 60501:
6934 {
6935 triggered_spell_id = 52724;
6936 basepoints0 = damage / 2;
6937 target = this;
6938 break;
6939 }
6940 // Divine purpose
6941 case 31871:
6942 case 31872:
6943 {
6944 // Roll chane
6945 if (!victim || !victim->IsAlive() || !roll_chance_i(triggerAmount))
6946 return false;
6947
6948 // Remove any stun effect on target
6950 return true;
6951 }
6952 // Glyph of Life Tap
6953 case 63320:
6954 {
6955 triggered_spell_id = 63321; // Life Tap
6956 break;
6957 }
6958 case 71519: // Deathbringer's Will Normal
6959 {
6960 if (!IsPlayer() || HasSpellCooldown(71484))
6961 return false;
6962
6963 AddSpellCooldown(71484, 0, cooldown);
6964
6965 std::vector<uint32> RandomSpells;
6966 switch (getClass())
6967 {
6968 case CLASS_WARRIOR:
6969 case CLASS_PALADIN:
6970 case CLASS_DEATH_KNIGHT:
6971 RandomSpells.push_back(71484);
6972 RandomSpells.push_back(71491);
6973 RandomSpells.push_back(71492);
6974 break;
6975 case CLASS_SHAMAN:
6976 case CLASS_ROGUE:
6977 RandomSpells.push_back(71486);
6978 RandomSpells.push_back(71485);
6979 RandomSpells.push_back(71492);
6980 break;
6981 case CLASS_DRUID:
6982 RandomSpells.push_back(71484);
6983 RandomSpells.push_back(71485);
6984 RandomSpells.push_back(71492);
6985 break;
6986 case CLASS_HUNTER:
6987 RandomSpells.push_back(71486);
6988 RandomSpells.push_back(71491);
6989 RandomSpells.push_back(71485);
6990 break;
6991 default:
6992 return false;
6993 }
6994 if (RandomSpells.empty()) // shouldn't happen
6995 return false;
6996
6997 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
6998 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
6999 break;
7000 }
7001 case 71562: // Deathbringer's Will Heroic
7002 {
7003 if (!IsPlayer() || HasSpellCooldown(71561))
7004 return false;
7005
7006 AddSpellCooldown(71561, 0, cooldown);
7007
7008 std::vector<uint32> RandomSpells;
7009 switch (getClass())
7010 {
7011 case CLASS_WARRIOR:
7012 case CLASS_PALADIN:
7013 case CLASS_DEATH_KNIGHT:
7014 RandomSpells.push_back(71561);
7015 RandomSpells.push_back(71559);
7016 RandomSpells.push_back(71560);
7017 break;
7018 case CLASS_SHAMAN:
7019 case CLASS_ROGUE:
7020 RandomSpells.push_back(71558);
7021 RandomSpells.push_back(71556);
7022 RandomSpells.push_back(71560);
7023 break;
7024 case CLASS_DRUID:
7025 RandomSpells.push_back(71561);
7026 RandomSpells.push_back(71556);
7027 RandomSpells.push_back(71560);
7028 break;
7029 case CLASS_HUNTER:
7030 RandomSpells.push_back(71558);
7031 RandomSpells.push_back(71559);
7032 RandomSpells.push_back(71556);
7033 break;
7034 default:
7035 return false;
7036 }
7037 if (RandomSpells.empty()) // shouldn't happen
7038 return false;
7039
7040 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
7041 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
7042 break;
7043 }
7044 // Freya, Petrified Bark
7045 case 62933:
7046 case 62337:
7047 {
7048 if (!victim)
7049 return false;
7050
7051 int32 dmg = damage;
7052 victim->CastCustomSpell(this, 62379, &dmg, 0, 0, true);
7053 return true;
7054 }
7055 // Trial of the Champion, Earth Shield
7056 case 67534:
7057 {
7058 const int32 dmg = (int32)damage;
7059 CastCustomSpell(this, 67535, &dmg, nullptr, nullptr, true, 0, triggeredByAura, triggeredByAura->GetCasterGUID());
7060 return true;
7061 }
7062 // Trial of the Crusader, Faction Champions, Retaliation
7063 case 65932:
7064 {
7065 // check attack comes not from behind
7066 if (!victim || !HasInArc(M_PI, victim))
7067 return false;
7068
7069 triggered_spell_id = 65934;
7070 break;
7071 }
7072 // Pit of Saron, Tyrannus, Overlord's Brand
7073 case 69172: // everything except for DoTs
7074 {
7075 if (!target)
7076 return false;
7077 if (Unit* caster = triggeredByAura->GetCaster())
7078 {
7080 {
7081 int32 dmg = 5.5f * damage;
7082 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
7083 }
7084 else
7085 {
7086 if (caster->GetVictim())
7087 {
7088 int32 dmg = damage;
7089 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
7090 }
7091 }
7092 }
7093 return true;
7094 }
7095 // Pit of Saron, Tyrannus, Overlord's Brand
7096 case 69173: // only DoTs
7097 {
7098 if (!target)
7099 return false;
7100 if (Unit* caster = triggeredByAura->GetCaster())
7101 {
7102 if (procEx & PROC_EX_INTERNAL_HOT)
7103 {
7104 int32 dmg = 5.5f * damage;
7105 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
7106 }
7107 else
7108 {
7109 if (caster->GetVictim())
7110 {
7111 int32 dmg = damage;
7112 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
7113 }
7114 }
7115 }
7116 return true;
7117 }
7118 // Icecrown Citadel, Lady Deathwhisper, Vampiric Might
7119 case 70674:
7120 {
7121 if (Unit* caster = triggeredByAura->GetCaster())
7122 {
7123 int32 dmg = 3 * damage;
7124 caster->CastCustomSpell(caster, 70677, &dmg, 0, 0, true);
7125 }
7126 return true;
7127 }
7128 // Item: Purified Shard of the Gods
7129 case 69755:
7130 {
7131 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69733 : 69729);
7132 break;
7133 }
7134 // Item: Shiny Shard of the Gods
7135 case 69739:
7136 {
7137 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69734 : 69730);
7138 break;
7139 }
7140 // VoA: Meteor Fists koralon
7141 case 66725:
7142 case 68161:
7143 {
7144 triggered_spell_id = 66765; // handled by spell_difficulty
7145 break;
7146 }
7147 }
7148 break;
7149 }
7150 case SPELLFAMILY_MAGE:
7151 {
7152 // Magic Absorption
7153 if (dummySpell->SpellIconID == 459) // only this spell has SpellIconID == 459 and dummy aura
7154 {
7156 return false;
7157
7158 // mana reward
7159 basepoints0 = CalculatePct(int32(GetMaxPower(POWER_MANA)), triggerAmount);
7160 target = this;
7161 triggered_spell_id = 29442;
7162 break;
7163 }
7164 // Hot Streak
7165 if (dummySpell->SpellIconID == 2999)
7166 {
7167 if (effIndex != 0)
7168 return false;
7169 AuraEffect* counter = triggeredByAura->GetBase()->GetEffect(EFFECT_1);
7170 if (!counter)
7171 return true;
7172
7173 // Count spell criticals in a row in second aura
7174 if (procEx & PROC_EX_CRITICAL_HIT)
7175 {
7176 counter->SetAmount(counter->GetAmount() * 2);
7177 if (counter->GetAmount() < 100) // not enough
7178 return true;
7179 // Crititcal counted -> roll chance
7180 if (roll_chance_i(triggerAmount))
7181 CastSpell(this, 48108, true, castItem, triggeredByAura);
7182 }
7183 counter->SetAmount(25);
7184 return true;
7185 }
7186 // Incanter's Regalia set (add trigger chance to Mana Shield)
7187 if (dummySpell->SpellFamilyFlags[0] & 0x8000)
7188 {
7189 if (!IsPlayer())
7190 return false;
7191
7192 target = this;
7193 triggered_spell_id = 37436;
7194 break;
7195 }
7196 switch (dummySpell->Id)
7197 {
7198 // Glyph of Polymorph
7199 case 56375:
7200 {
7201 if (!target)
7202 return false;
7203 target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(32409)); // SW:D shall not be removed.
7206 return true;
7207 }
7208 // Glyph of Icy Veins
7209 case 56374:
7210 {
7213 return true;
7214 }
7215 // Glyph of Ice Block
7216 case 56372:
7217 {
7218 Player* player = ToPlayer();
7219 if (!player)
7220 return false;
7221
7222 SpellCooldowns const cooldowns = player->GetSpellCooldowns();
7223 // remove cooldowns on all ranks of Frost Nova
7224 for (SpellCooldowns::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
7225 {
7226 SpellInfo const* cdSpell = sSpellMgr->GetSpellInfo(itr->first);
7227 // Frost Nova
7228 if (cdSpell && cdSpell->SpellFamilyName == SPELLFAMILY_MAGE
7229 && cdSpell->SpellFamilyFlags[0] & 0x00000040)
7230 player->RemoveSpellCooldown(cdSpell->Id, true);
7231 }
7232 break;
7233 }
7234 }
7235 break;
7236 }
7238 {
7239 // Second Wind
7240 if (dummySpell->SpellIconID == 1697)
7241 {
7242 // only for spells and hit/crit (trigger start always) and not start from self casted spells (5530 Mace Stun Effect for example)
7243 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
7244 return false;
7245 // Need stun or root mechanic
7246 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))))
7247 return false;
7248
7249 switch (dummySpell->Id)
7250 {
7251 case 29838:
7252 triggered_spell_id = 29842;
7253 break;
7254 case 29834:
7255 triggered_spell_id = 29841;
7256 break;
7257 case 42770:
7258 triggered_spell_id = 42771;
7259 break;
7260 default:
7261 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled spell id: {} (SW)", dummySpell->Id);
7262 return false;
7263 }
7264
7265 target = this;
7266 break;
7267 }
7268 break;
7269 }
7271 {
7272 switch (dummySpell->Id)
7273 {
7274 // Nightfall
7275 case 18094:
7276 case 18095:
7277 // Glyph of corruption
7278 case 56218:
7279 {
7280 target = this;
7281 triggered_spell_id = 17941;
7282 break;
7283 }
7284 // Soul Leech
7285 case 30293:
7286 case 30295:
7287 case 30296:
7288 {
7289 // Improved Soul Leech
7290 AuraEffectList const& SoulLeechAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
7291 for (Unit::AuraEffectList::const_iterator i = SoulLeechAuras.begin(); i != SoulLeechAuras.end(); ++i)
7292 {
7293 if ((*i)->GetId() == 54117 || (*i)->GetId() == 54118)
7294 {
7295 if ((*i)->GetEffIndex() != 0)
7296 continue;
7297 basepoints0 = int32((*i)->GetAmount());
7298 target = GetGuardianPet();
7299 if (target)
7300 {
7301 // regen mana for pet
7302 CastCustomSpell(target, 54607, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7303 }
7304 // regen mana for caster
7305 CastCustomSpell(this, 59117, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7306 // Get second aura of spell for replenishment effect on party
7307 if (AuraEffect const* aurEff = (*i)->GetBase()->GetEffect(EFFECT_1))
7308 {
7309 // Replenishment - roll chance
7310 if (roll_chance_i(aurEff->GetAmount()))
7311 {
7312 CastSpell(this, 57669, true, castItem, triggeredByAura);
7313 }
7314 }
7315 break;
7316 }
7317 }
7318 // health
7319 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7320 target = this;
7321 triggered_spell_id = 30294;
7322 break;
7323 }
7324 // Shadowflame (Voidheart Raiment set bonus)
7325 case 37377:
7326 {
7327 triggered_spell_id = 37379;
7328 break;
7329 }
7330 // Pet Healing (Corruptor Raiment or Rift Stalker Armor)
7331 case 37381:
7332 {
7333 target = GetGuardianPet();
7334 if (!target)
7335 return false;
7336
7337 // heal amount
7338 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7339 triggered_spell_id = 37382;
7340 break;
7341 }
7342 // Shadowflame Hellfire (Voidheart Raiment set bonus)
7343 case 39437:
7344 {
7345 triggered_spell_id = 37378;
7346 break;
7347 }
7348 }
7349 break;
7350 }
7351 case SPELLFAMILY_PRIEST:
7352 {
7353 // Body and Soul
7354 if (dummySpell->SpellIconID == 2218)
7355 {
7356 // Proc only from Abolish desease on self cast
7357 if (procSpell->Id != 552 || victim != this || !roll_chance_i(triggerAmount))
7358 return false;
7359 triggered_spell_id = 64136;
7360 target = this;
7361 break;
7362 }
7363 switch (dummySpell->Id)
7364 {
7365 // Vampiric Embrace
7366 case 15286:
7367 {
7368 if (!victim || !victim->IsAlive() || procSpell->SpellFamilyFlags[1] & 0x80000)
7369 return false;
7370
7371 // heal amount
7372 int32 total = CalculatePct(int32(damage), triggerAmount);
7373 int32 team = total / 5;
7374 int32 self = total - team;
7375 CastCustomSpell(this, 15290, &team, &self, nullptr, true, castItem, triggeredByAura);
7376 return true; // no hidden cooldown
7377 }
7378 // Priest Tier 6 Trinket (Ashtongue Talisman of Acumen)
7379 case 40438:
7380 {
7381 // Shadow Word: Pain
7382 if (procSpell->SpellFamilyFlags[0] & 0x8000)
7383 triggered_spell_id = 40441;
7384 // Renew
7385 else if (procSpell->SpellFamilyFlags[0] & 0x40)
7386 triggered_spell_id = 40440;
7387 else
7388 return false;
7389
7390 target = this;
7391 break;
7392 }
7393 // Improved Shadowform
7394 case 47570:
7395 case 47569:
7396 {
7397 if (!roll_chance_i(triggerAmount))
7398 return false;
7399
7401 break;
7402 }
7403 // Glyph of Dispel Magic
7404 case 55677:
7405 {
7406 // Dispel Magic shares spellfamilyflag with abolish disease
7407 if (procSpell->SpellIconID != 74)
7408 return false;
7409 if (!target || !target->IsFriendlyTo(this))
7410 return false;
7411
7412 basepoints0 = int32(target->CountPctFromMaxHealth(triggerAmount));
7413 triggered_spell_id = 56131;
7414 break;
7415 }
7416 // Oracle Healing Bonus ("Garments of the Oracle" set)
7417 case 26169:
7418 {
7419 // heal amount
7420 basepoints0 = int32(CalculatePct(damage, 10));
7421 target = this;
7422 triggered_spell_id = 26170;
7423 break;
7424 }
7425 // Frozen Shadoweave (Shadow's Embrace set) warning! its not only priest set
7426 case 39372:
7427 {
7428 if (!procSpell || (procSpell->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_SHADOW)) == 0)
7429 return false;
7430
7431 // heal amount
7432 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7433 target = this;
7434 triggered_spell_id = 39373;
7435 break;
7436 }
7437 // Greater Heal (Vestments of Faith (Priest Tier 3) - 4 pieces bonus)
7438 case 28809:
7439 {
7440 triggered_spell_id = 28810;
7441 break;
7442 }
7443 // Priest T10 Healer 2P Bonus
7444 case 70770:
7445 // Flash Heal
7446 if (procSpell->SpellFamilyFlags[0] & 0x800)
7447 {
7448 triggered_spell_id = 70772;
7449 SpellInfo const* blessHealing = sSpellMgr->GetSpellInfo(triggered_spell_id);
7450 if (!blessHealing || !victim)
7451 return false;
7452 basepoints0 = int32(CalculatePct(damage, triggerAmount) / (blessHealing->GetMaxDuration() / blessHealing->Effects[0].Amplitude));
7453 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
7454 return true;
7455 }
7456 break;
7457 }
7458 break;
7459 }
7460 case SPELLFAMILY_DRUID:
7461 {
7462 switch (dummySpell->Id)
7463 {
7464 // Glyph of Innervate
7465 case 54832:
7466 {
7467 if (procSpell->SpellIconID != 62)
7468 return false;
7469
7470 int32 mana_perc = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcValue();
7471 basepoints0 = int32(CalculatePct(GetCreatePowers(POWER_MANA), mana_perc) / 10);
7472 triggered_spell_id = 54833;
7473 target = this;
7474 break;
7475 }
7476 // Glyph of Starfire
7477 case 54845:
7478 {
7479 triggered_spell_id = 54846;
7480 break;
7481 }
7482 // Glyph of Shred
7483 case 54815:
7484 {
7485 if (!target)
7486 return false;
7487
7488 // try to find spell Rip on the target
7489 if (AuraEffect const* AurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00800000, 0x0, 0x0, GetGUID()))
7490 {
7491 // Rip's max duration, note: spells which modifies Rip's duration also counted like Glyph of Rip
7492 uint32 CountMin = AurEff->GetBase()->GetMaxDuration();
7493
7494 // just Rip's max duration without other spells
7495 uint32 CountMax = AurEff->GetSpellInfo()->GetMaxDuration();
7496
7497 // add possible auras' and Glyph of Shred's max duration
7498 CountMax += 3 * triggerAmount * IN_MILLISECONDS; // Glyph of Shred -> +6 seconds
7499 CountMax += HasAura(54818) ? 4 * IN_MILLISECONDS : 0; // Glyph of Rip -> +4 seconds
7500 CountMax += HasAura(60141) ? 4 * IN_MILLISECONDS : 0; // Rip Duration/Lacerate Damage -> +4 seconds
7501
7502 // if min < max -> that means caster didn't cast 3 shred yet
7503 // so set Rip's duration and max duration
7504 if (CountMin < CountMax)
7505 {
7506 AurEff->GetBase()->SetDuration(AurEff->GetBase()->GetDuration() + triggerAmount * IN_MILLISECONDS);
7507 AurEff->GetBase()->SetMaxDuration(CountMin + triggerAmount * IN_MILLISECONDS);
7508 return true;
7509 }
7510 }
7511 // if not found Rip
7512 return false;
7513 }
7514 // Glyph of Rake
7515 case 54821:
7516 {
7517 if (procSpell->SpellVisual[0] == 750 && procSpell->Effects[1].ApplyAuraName == 3)
7518 {
7519 if (target && target->IsCreature())
7520 {
7521 triggered_spell_id = 54820;
7522 break;
7523 }
7524 }
7525 return false;
7526 }
7527 // Leader of the Pack
7528 case 24932:
7529 {
7530 if (triggerAmount <= 0)
7531 return false;
7532 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
7533 target = this;
7534 triggered_spell_id = 34299;
7535 if (triggeredByAura->GetCasterGUID() != GetGUID())
7536 break;
7537 int32 basepoints1 = CalculatePct(GetMaxPower(Powers(POWER_MANA)), triggerAmount * 2);
7538 // Improved Leader of the Pack
7539 // Check cooldown of heal spell cooldown
7540 if (IsPlayer() && !ToPlayer()->HasSpellCooldown(34299))
7541 CastCustomSpell(this, 68285, &basepoints1, 0, 0, true, 0, triggeredByAura);
7542 break;
7543 }
7544 // Healing Touch (Dreamwalker Raiment set)
7545 case 28719:
7546 {
7547 // mana back
7548 basepoints0 = int32(CalculatePct(spellProc->GetPowerCost(), 30));
7549 target = this;
7550 triggered_spell_id = 28742;
7551 break;
7552 }
7553 // Glyph of Rejuvenation
7554 case 54754:
7555 {
7556 if (!victim || !victim->HealthBelowPct(uint32(triggerAmount)))
7557 return false;
7558 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7559 triggered_spell_id = 54755;
7560 break;
7561 }
7562 // Healing Touch Refund (Idol of Longevity trinket)
7563 case 28847:
7564 {
7565 target = this;
7566 triggered_spell_id = 28848;
7567 break;
7568 }
7569 // Mana Restore (Malorne Raiment set / Malorne Regalia set)
7570 case 37288:
7571 case 37295:
7572 {
7573 target = this;
7574 triggered_spell_id = 37238;
7575 break;
7576 }
7577 // Druid Tier 6 Trinket
7578 case 40442:
7579 {
7580 float chance;
7581
7582 // Starfire
7583 if (procSpell->SpellFamilyFlags[0] & 0x4)
7584 {
7585 triggered_spell_id = 40445;
7586 chance = 25.0f;
7587 }
7588 // Rejuvenation
7589 else if (procSpell->SpellFamilyFlags[0] & 0x10)
7590 {
7591 triggered_spell_id = 40446;
7592 chance = 25.0f;
7593 }
7594 // Mangle (Bear) and Mangle (Cat)
7595 else if (procSpell->SpellFamilyFlags[1] & 0x00000440)
7596 {
7597 triggered_spell_id = 40452;
7598 chance = 40.0f;
7599 }
7600 else
7601 return false;
7602
7603 if (!roll_chance_f(chance))
7604 return false;
7605
7606 target = this;
7607 break;
7608 }
7609 // Maim Interrupt
7610 case 44835:
7611 {
7612 // Deadly Interrupt Effect
7613 triggered_spell_id = 32747;
7614 break;
7615 }
7616 // Item - Druid T10 Restoration 4P Bonus (Rejuvenation)
7617 case 70664:
7618 {
7619 // xinef: proc only from normal Rejuvenation, and proc rejuvenation
7620 if (!victim || !procSpell || procSpell->SpellIconID != 64)
7621 return false;
7622
7623 Player* caster = ToPlayer();
7624 if (!caster)
7625 return false;
7626 if (!caster->GetGroup() && victim == this)
7627 return false;
7628
7629 CastCustomSpell(70691, SPELLVALUE_BASE_POINT0, damage, victim, true);
7630 return true;
7631 }
7632 }
7633 // Eclipse
7634 if (dummySpell->SpellIconID == 2856 && IsPlayer())
7635 {
7636 if (!procSpell || effIndex != 0)
7637 return false;
7638
7639 bool isWrathSpell = (procSpell->SpellFamilyFlags[0] & 1);
7640
7641 if (!roll_chance_f(dummySpell->ProcChance * (isWrathSpell ? 0.6f : 1.0f)))
7642 return false;
7643
7644 target = this;
7645 if (target->HasAura(isWrathSpell ? 48517 : 48518))
7646 return false;
7647
7648 triggered_spell_id = isWrathSpell ? 48518 : 48517;
7649 break;
7650 }
7651 [[fallthrough]];
7652 }
7653 case SPELLFAMILY_ROGUE:
7654 {
7655 switch (dummySpell->Id)
7656 {
7657 // Glyph of Backstab
7658 case 56800:
7659 {
7660 if (victim)
7661 if (AuraEffect* aurEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x100000, 0, 0, GetGUID()))
7662 if (Aura* aur = aurEff->GetBase())
7663 if (!aur->IsRemoved() && aur->GetDuration() > 0)
7664 if ((aur->GetApplyTime() + aur->GetMaxDuration() / 1000 + 5) > (GameTime::GetGameTime().count() + aur->GetDuration() / 1000))
7665 {
7666 aur->SetDuration(aur->GetDuration() + 2000);
7667 return true;
7668 }
7669 return false;
7670 }
7671 // Deadly Throw Interrupt
7672 case 32748:
7673 {
7674 // Prevent cast Deadly Throw Interrupt on self from last effect (apply dummy) of Deadly Throw
7675 if (this == victim)
7676 return false;
7677
7678 triggered_spell_id = 32747;
7679 break;
7680 }
7681 }
7682 // Master of subtlety
7683 if (dummySpell->SpellIconID == 2114)
7684 {
7685 triggered_spell_id = 31665;
7686 basepoints0 = triggerAmount;
7687 break;
7688 }
7689 // Cut to the Chase
7690 if (dummySpell->SpellIconID == 2909)
7691 {
7692 // "refresh your Slice and Dice duration to its 5 combo point maximum"
7693 // lookup Slice and Dice
7694 if (AuraEffect const* aur = GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000, 0, 0))
7695 {
7696 aur->GetBase()->SetDuration(aur->GetSpellInfo()->GetMaxDuration(), true);
7697 return true;
7698 }
7699 return false;
7700 }
7701 // Deadly Brew
7702 else if (dummySpell->SpellIconID == 2963)
7703 {
7704 triggered_spell_id = 3409;
7705 break;
7706 }
7707 // Quick Recovery
7708 else if (dummySpell->SpellIconID == 2116)
7709 {
7710 if (!procSpell)
7711 return false;
7712
7713 // energy cost save
7714 basepoints0 = CalculatePct(int32(procSpell->ManaCost), triggerAmount);
7715 if (basepoints0 <= 0)
7716 return false;
7717
7718 target = this;
7719 triggered_spell_id = 31663;
7720 break;
7721 }
7722 break;
7723 }
7724 case SPELLFAMILY_HUNTER:
7725 {
7726 switch (dummySpell->SpellIconID)
7727 {
7728 case 2236: // Thrill of the Hunt
7729 {
7730 if (!procSpell)
7731 return false;
7732
7734
7735 // Disable charge drop because of Lock and Load
7736 if (spell)
7737 ToPlayer()->SetSpellModTakingSpell(spell, false);
7738
7739 // Explosive Shot
7740 if (procSpell->SpellFamilyFlags[2] & 0x200)
7741 {
7742 if (!victim)
7743 return false;
7744 if (AuraEffect const* pEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DUMMY, SPELLFAMILY_HUNTER, 0x0, 0x80000000, 0x0, GetGUID()))
7745 basepoints0 = pEff->GetSpellInfo()->CalcPowerCost(this, SpellSchoolMask(pEff->GetSpellInfo()->SchoolMask)) * 4 / 10 / 3;
7746 }
7747 else
7748 basepoints0 = procSpell->CalcPowerCost(this, SpellSchoolMask(procSpell->SchoolMask)) * 4 / 10;
7749
7750 if (spell)
7751 ToPlayer()->SetSpellModTakingSpell(spell, true);
7752
7753 if (basepoints0 <= 0)
7754 return false;
7755
7756 target = this;
7757 triggered_spell_id = 34720;
7758 break;
7759 }
7760 case 3406: // Hunting Party
7761 {
7762 triggered_spell_id = 57669;
7763 target = this;
7764 break;
7765 }
7766 case 3560: // Rapid Recuperation
7767 {
7768 // This effect only from Rapid Killing (mana regen)
7769 if (!(procSpell->SpellFamilyFlags[1] & 0x01000000))
7770 return false;
7771
7772 target = this;
7773
7774 switch (dummySpell->Id)
7775 {
7776 case 53228: // Rank 1
7777 triggered_spell_id = 56654;
7778 break;
7779 case 53232: // Rank 2
7780 triggered_spell_id = 58882;
7781 break;
7782 }
7783 break;
7784 }
7785 }
7786
7787 switch (dummySpell->Id)
7788 {
7789 case 57870: // Glyph of Mend Pet
7790 {
7791 if (!victim)
7792 return false;
7793
7794 victim->CastSpell(victim, 57894, true, nullptr, nullptr, GetGUID());
7795 return true;
7796 }
7797 }
7798 break;
7799 }
7801 {
7802 // Light's Beacon - Beacon of Light
7803 if (dummySpell->Id == 53651)
7804 {
7805 if (!victim)
7806 return false;
7807
7808 // Do not proc from Glyph of Holy Light and Judgement of Light
7809 if (procSpell->Id == 20267 || procSpell->Id == 54968)
7810 {
7811 return false;
7812 }
7813
7814 Unit* beaconTarget = triggeredByAura->GetBase()->GetCaster();
7815 if (!beaconTarget || beaconTarget == this || !beaconTarget->GetAura(53563, victim->GetGUID()))
7816 return false;
7817
7818 basepoints0 = int32(damage);
7819 triggered_spell_id = procSpell->IsRankOf(sSpellMgr->GetSpellInfo(635)) ? 53652 : 53654;
7820
7821 victim->CastCustomSpell(beaconTarget, triggered_spell_id, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura, victim->GetGUID());
7822 return true;
7823 }
7824 // Judgements of the Wise
7825 if (dummySpell->SpellIconID == 3017)
7826 {
7827 target = this;
7828 triggered_spell_id = 31930;
7829 // replenishment
7830 CastSpell(this, 57669, true, castItem, triggeredByAura);
7831 break;
7832 }
7833 // Righteous Vengeance
7834 if (dummySpell->SpellIconID == 3025)
7835 {
7836 if (!victim)
7837 return false;
7838
7839 // 4 damage tick
7840 basepoints0 = triggerAmount * damage / 400;
7841 triggered_spell_id = 61840;
7842 // Add remaining ticks to damage done
7843 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
7844 return true;
7845 }
7846 // Sheath of Light
7847 if (dummySpell->SpellIconID == 3030)
7848 {
7849 // 4 healing tick
7850 basepoints0 = triggerAmount * damage / 400;
7851 triggered_spell_id = 54203;
7852 break;
7853 }
7854 switch (dummySpell->Id)
7855 {
7856 // Judgement of Light
7857 case 20185:
7858 {
7859 if (!victim || !victim->IsAlive())
7860 return false;
7861
7862 auto* caster = triggeredByAura->GetBase()->GetCaster();
7863 if (!caster || !victim->IsFriendlyTo(caster))
7864 return false;
7865
7866 // 2% of base health
7867 basepoints0 = int32(victim->CountPctFromMaxHealth(2));
7868 victim->CastCustomSpell(victim, 20267, &basepoints0, 0, 0, true, 0, triggeredByAura);
7869 return true;
7870 }
7871 // Judgement of Wisdom
7872 case 20186:
7873 {
7874 if (!victim || !victim->IsAlive() || !victim->HasActivePowerType(POWER_MANA))
7875 return false;
7876
7877 auto* caster = triggeredByAura->GetBase()->GetCaster();
7878 if (!caster || !victim->IsFriendlyTo(caster))
7879 return false;
7880
7881 // 2% of base mana
7882 basepoints0 = int32(CalculatePct(victim->GetCreateMana(), 2));
7883 victim->CastCustomSpell(victim, 20268, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura);
7884 return true;
7885 }
7886 // Holy Power (Redemption Armor set)
7887 case 28789:
7888 {
7889 if (!victim)
7890 return false;
7891
7892 // Set class defined buff
7893 switch (victim->getClass())
7894 {
7895 case CLASS_PALADIN:
7896 case CLASS_PRIEST:
7897 case CLASS_SHAMAN:
7898 case CLASS_DRUID:
7899 triggered_spell_id = 28795; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
7900 break;
7901 case CLASS_MAGE:
7902 case CLASS_WARLOCK:
7903 triggered_spell_id = 28793; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
7904 break;
7905 case CLASS_HUNTER:
7906 case CLASS_ROGUE:
7907 triggered_spell_id = 28791; // Increases the friendly target's attack power by $s1 for $d.
7908 break;
7909 case CLASS_WARRIOR:
7910 triggered_spell_id = 28790; // Increases the friendly target's armor
7911 break;
7912 default:
7913 return false;
7914 }
7915 break;
7916 }
7917 // Seal of Vengeance (damage calc on apply aura)
7918 case 31801:
7919 {
7920 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
7921 return false;
7922
7923 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
7924 bool stacker = !procSpell || procSpell->Id == 53595;
7925 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
7926 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
7927
7928 if (!stacker && !damager)
7929 return false;
7930
7931 triggered_spell_id = 31803;
7932
7933 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
7934 {
7935 if (aur->GetStackAmount() == 5)
7936 {
7937 if (stacker)
7938 aur->RefreshDuration();
7939 }
7940 }
7941
7942 CastSpell(victim, 42463, true, castItem, triggeredByAura); // Seal of Vengeance
7943
7944 if (!stacker)
7945 return false;
7946 break;
7947 }
7948 // Seal of Corruption
7949 case 53736:
7950 {
7951 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
7952 return false;
7953
7954 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
7955 bool stacker = !procSpell || procSpell->Id == 53595;
7956 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
7957 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
7958
7959 if (!stacker && !damager)
7960 return false;
7961
7962 triggered_spell_id = 53742;
7963
7964 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
7965 {
7966 if (aur->GetStackAmount() == 5)
7967 {
7968 if (stacker)
7969 aur->RefreshDuration();
7970 }
7971 }
7972
7973 CastSpell(victim, 53739, true, castItem, triggeredByAura); // Seal of Corruption
7974
7975 if (!stacker)
7976 return false;
7977 break;
7978 }
7979 // Spiritual Attunement
7980 case 31785:
7981 case 33776:
7982 {
7983 // if healed by another unit (victim)
7984 if (this == victim)
7985 return false;
7986
7987 // dont allow non-positive dots to proc
7988 if (!procSpell || !procSpell->IsPositive())
7989 return false;
7990
7991 HealInfo const* healInfo = eventInfo.GetHealInfo();
7992 if (!healInfo)
7993 {
7994 return false;
7995 }
7996
7997 uint32 effectiveHeal = healInfo->GetEffectiveHeal();
7998 if (effectiveHeal)
7999 {
8000 // heal amount
8001 basepoints0 = int32(CalculatePct(effectiveHeal, triggerAmount));
8002 target = this;
8003
8004 if (basepoints0)
8005 triggered_spell_id = 31786;
8006 }
8007 break;
8008 }
8009 // Paladin Tier 6 Trinket (Ashtongue Talisman of Zeal)
8010 case 40470:
8011 {
8012 if (!procSpell)
8013 return false;
8014
8015 float chance = 0.0f;
8016
8017 // Flash of light/Holy light
8018 if (procSpell->SpellFamilyFlags[0] & 0xC0000000)
8019 {
8020 triggered_spell_id = 40471;
8021 chance = 15.0f;
8022 }
8023 // Judgement (any)
8024 else if (procSpell->SpellFamilyFlags[0] & 0x800000)
8025 {
8026 triggered_spell_id = 40472;
8027 chance = 50.0f;
8028 }
8029 else
8030 return false;
8031
8032 if (!roll_chance_f(chance))
8033 return false;
8034
8035 break;
8036 }
8037 // Glyph of Holy Light
8038 case 54937:
8039 {
8040 triggered_spell_id = 54968;
8041 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8042 break;
8043 }
8044 // Item - Paladin T8 Holy 2P Bonus
8045 case 64890:
8046 {
8047 triggered_spell_id = 64891;
8048 basepoints0 = triggerAmount * damage / 300;
8049 break;
8050 }
8051 case 71406: // Tiny Abomination in a Jar
8052 case 71545: // Tiny Abomination in a Jar (Heroic)
8053 {
8054 if (!victim || !victim->IsAlive())
8055 return false;
8056
8057 CastSpell(this, 71432, true, nullptr, triggeredByAura);
8058
8059 Aura const* dummy = GetAura(71432);
8060 if (!dummy || dummy->GetStackAmount() < (dummySpell->Id == 71406 ? 8 : 7))
8061 return false;
8062
8063 RemoveAurasDueToSpell(71432);
8064 triggered_spell_id = 71433; // default main hand attack
8065 // roll if offhand
8066 if (Player const* player = ToPlayer())
8067 if (player->GetWeaponForAttack(OFF_ATTACK, true) && urand(0, 1))
8068 triggered_spell_id = 71434;
8069 target = victim;
8070 break;
8071 }
8072 // Item - Icecrown 25 Normal Dagger Proc
8073 case 71880:
8074 {
8075 switch (getPowerType())
8076 {
8077 case POWER_MANA:
8078 triggered_spell_id = 71881;
8079 break;
8080 case POWER_RAGE:
8081 triggered_spell_id = 71883;
8082 break;
8083 case POWER_ENERGY:
8084 triggered_spell_id = 71882;
8085 break;
8086 case POWER_RUNIC_POWER:
8087 triggered_spell_id = 71884;
8088 break;
8089 default:
8090 return false;
8091 }
8092 break;
8093 }
8094 // Item - Icecrown 25 Heroic Dagger Proc
8095 case 71892:
8096 {
8097 switch (getPowerType())
8098 {
8099 case POWER_MANA:
8100 triggered_spell_id = 71888;
8101 break;
8102 case POWER_RAGE:
8103 triggered_spell_id = 71886;
8104 break;
8105 case POWER_ENERGY:
8106 triggered_spell_id = 71887;
8107 break;
8108 case POWER_RUNIC_POWER:
8109 triggered_spell_id = 71885;
8110 break;
8111 default:
8112 return false;
8113 }
8114 break;
8115 }
8116 }
8117 break;
8118 }
8119 case SPELLFAMILY_SHAMAN:
8120 {
8121 switch (dummySpell->Id)
8122 {
8123 // Tidal Force
8124 case 55198:
8125 {
8126 // Remove aura stack from caster
8127 RemoveAuraFromStack(55166);
8128 // drop charges
8129 return false;
8130 }
8131 // Totemic Power (The Earthshatterer set)
8132 case 28823:
8133 {
8134 if (!victim)
8135 return false;
8136
8137 // Set class defined buff
8138 switch (victim->getClass())
8139 {
8140 case CLASS_PALADIN:
8141 case CLASS_PRIEST:
8142 case CLASS_SHAMAN:
8143 case CLASS_DRUID:
8144 triggered_spell_id = 28824; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
8145 break;
8146 case CLASS_MAGE:
8147 case CLASS_WARLOCK:
8148 triggered_spell_id = 28825; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
8149 break;
8150 case CLASS_HUNTER:
8151 case CLASS_ROGUE:
8152 triggered_spell_id = 28826; // Increases the friendly target's attack power by $s1 for $d.
8153 break;
8154 case CLASS_WARRIOR:
8155 triggered_spell_id = 28827; // Increases the friendly target's armor
8156 break;
8157 default:
8158 return false;
8159 }
8160 break;
8161 }
8162 // Lesser Healing Wave (Totem of Flowing Water Relic)
8163 case 28849:
8164 {
8165 target = this;
8166 triggered_spell_id = 28850;
8167 break;
8168 }
8169 // Windfury Weapon (Passive) 1-8 Ranks
8170 case 33757:
8171 {
8172 Player* player = ToPlayer();
8173 if (!player || !castItem || !castItem->IsEquipped() || !victim || !victim->IsAlive())
8174 return false;
8175
8176 if (triggeredByAura->GetBase() && castItem->GetGUID() != triggeredByAura->GetBase()->GetCastItemGUID())
8177 return false;
8178
8179 WeaponAttackType attType = WeaponAttackType(player->GetAttackBySlot(castItem->GetSlot()));
8180 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8181 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8182 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8183 return false;
8184
8185 // Now amount of extra power stored in 1 effect of Enchant spell
8186 // Get it by item enchant id
8187 uint32 spellId;
8189 {
8190 case 283:
8191 spellId = 8232;
8192 break; // 1 Rank
8193 case 284:
8194 spellId = 8235;
8195 break; // 2 Rank
8196 case 525:
8197 spellId = 10486;
8198 break; // 3 Rank
8199 case 1669:
8200 spellId = 16362;
8201 break; // 4 Rank
8202 case 2636:
8203 spellId = 25505;
8204 break; // 5 Rank
8205 case 3785:
8206 spellId = 58801;
8207 break; // 6 Rank
8208 case 3786:
8209 spellId = 58803;
8210 break; // 7 Rank
8211 case 3787:
8212 spellId = 58804;
8213 break; // 8 Rank
8214 default:
8215 {
8216 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled item enchantment (rank?) {} for spell id: {} (Windfury)",
8217 castItem->GetEnchantmentId(EnchantmentSlot(TEMP_ENCHANTMENT_SLOT)), dummySpell->Id);
8218 return false;
8219 }
8220 }
8221
8222 SpellInfo const* windfurySpellInfo = sSpellMgr->GetSpellInfo(spellId);
8223 if (!windfurySpellInfo)
8224 {
8225 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non-existing spell id: {} (Windfury)", spellId);
8226 return false;
8227 }
8228
8229 int32 extra_attack_power = CalculateSpellDamage(victim, windfurySpellInfo, 1);
8230
8231 // Value gained from additional AP
8232 basepoints0 = int32(extra_attack_power / 14.0f * GetAttackTime(attType) / 1000);
8233
8234 if (procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8235 triggered_spell_id = 25504;
8236
8237 if (procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8238 triggered_spell_id = 33750;
8239
8240 // custom cooldown processing case
8241 if (player->HasSpellCooldown(dummySpell->Id))
8242 return false;
8243
8244 // apply cooldown before cast to prevent processing itself
8245 player->AddSpellCooldown(dummySpell->Id, 0, 3 * IN_MILLISECONDS);
8246
8247 // Attack Twice
8248 for (uint32 i = 0; i < 2; ++i)
8249 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8250
8251 return true;
8252 }
8253 // Shaman Tier 6 Trinket
8254 case 40463:
8255 {
8256 if (!procSpell)
8257 return false;
8258
8259 float chance;
8260 if (procSpell->SpellFamilyFlags[0] & 0x1)
8261 {
8262 triggered_spell_id = 40465; // Lightning Bolt
8263 chance = 15.0f;
8264 }
8265 else if (procSpell->SpellFamilyFlags[0] & 0x80)
8266 {
8267 triggered_spell_id = 40465; // Lesser Healing Wave
8268 chance = 10.0f;
8269 }
8270 else if (procSpell->SpellFamilyFlags[1] & 0x00000010)
8271 {
8272 triggered_spell_id = 40466; // Stormstrike
8273 chance = 50.0f;
8274 }
8275 else
8276 return false;
8277
8278 if (!roll_chance_f(chance))
8279 return false;
8280
8281 target = this;
8282 break;
8283 }
8284 // Glyph of Healing Wave
8285 case 55440:
8286 {
8287 // Not proc from self heals
8288 if (this == victim)
8289 return false;
8290 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8291 target = this;
8292 triggered_spell_id = 55533;
8293 break;
8294 }
8295 // Spirit Hunt
8296 case 58877:
8297 {
8298 // Cast on owner
8299 target = GetOwner();
8300 if (!target)
8301 return false;
8302 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8303 triggered_spell_id = 58879;
8304 // Heal wolf
8305 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8306 break;
8307 }
8308 // Shaman T9 Elemental 4P Bonus
8309 case 67228:
8310 {
8311 // Lava Burst
8312 if (procSpell->SpellFamilyFlags[1] & 0x1000)
8313 {
8314 triggered_spell_id = 71824;
8315 SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id);
8316 if (!triggeredSpell)
8317 return false;
8318 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / triggeredSpell->Effects[0].Amplitude);
8319 }
8320 break;
8321 }
8322 // Item - Shaman T10 Elemental 4P Bonus
8323 case 70817:
8324 {
8325 if (!target)
8326 return false;
8327 // try to find spell Flame Shock on the target
8328 if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0x0, 0x0, GetGUID()))
8329 {
8330 Aura* flameShock = aurEff->GetBase();
8331 int32 extraTime = 2 * aurEff->GetAmplitude();
8332 flameShock->SetMaxDuration(flameShock->GetMaxDuration() + extraTime);
8333 flameShock->SetDuration(flameShock->GetDuration() + extraTime);
8334
8335 return true;
8336 }
8337 // if not found Flame Shock
8338 return false;
8339 }
8340 break;
8341 }
8342 // Frozen Power
8343 if (dummySpell->SpellIconID == 3780)
8344 {
8345 if (!target)
8346 return false;
8347 if (GetDistance(target) < 15.0f)
8348 return false;
8349 float chance = (float)triggerAmount;
8350 if (!roll_chance_f(chance))
8351 return false;
8352
8353 triggered_spell_id = 63685;
8354 break;
8355 }
8356 // Ancestral Awakening
8357 if (dummySpell->SpellIconID == 3065)
8358 {
8359 triggered_spell_id = 52759;
8360 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8361 target = this;
8362 break;
8363 }
8364 // Flametongue Weapon (Passive)
8365 if (dummySpell->SpellFamilyFlags[0] & 0x200000)
8366 {
8367 if (!IsPlayer() || !victim || !victim->IsAlive() || !castItem || !castItem->IsEquipped())
8368 return false;
8369
8371 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8372 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8373 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8374 return false;
8375
8376 float fire_onhit = float(CalculatePct(dummySpell->Effects[EFFECT_0]. CalcValue(), 1.0f));
8377
8378 float add_spellpower = (float)(SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE)
8380
8381 // 1.3speed = 5%, 2.6speed = 10%, 4.0 speed = 15%, so, 1.0speed = 3.84%
8382 ApplyPct(add_spellpower, 3.84f);
8383
8384 // Enchant on Off-Hand and ready?
8385 if (castItem->GetSlot() == EQUIPMENT_SLOT_OFFHAND && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8386 {
8387 float BaseWeaponSpeed = GetAttackTime(OFF_ATTACK) / 1000.0f;
8388
8389 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8390 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8391 triggered_spell_id = 10444;
8392 }
8393
8394 // Enchant on Main-Hand and ready?
8395 else if (castItem->GetSlot() == EQUIPMENT_SLOT_MAINHAND && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8396 {
8397 float BaseWeaponSpeed = GetAttackTime(BASE_ATTACK) / 1000.0f;
8398
8399 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8400 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8401 triggered_spell_id = 10444;
8402 }
8403
8404 // If not ready, we should return, shouldn't we?!
8405 else
8406 return false;
8407
8408 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8409 return true;
8410 }
8411 // Improved Water Shield
8412 if (dummySpell->SpellIconID == 2287)
8413 {
8414 if (!procSpell)
8415 return false;
8416
8417 // Default chance for Healing Wave and Riptide
8418 float chance = (float)triggeredByAura->GetAmount();
8419
8420 if (procSpell->SpellFamilyFlags[0] & 0x80)
8421 // Lesser Healing Wave - 0.6 of default
8422 chance *= 0.6f;
8423 else if (procSpell->SpellFamilyFlags[0] & 0x100)
8424 // Chain heal - 0.3 of default
8425 chance *= 0.3f;
8426
8427 if (!roll_chance_f(chance))
8428 return false;
8429
8430 // Water Shield
8431 if (AuraEffect const* aurEff = GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0, 0x00000020, 0))
8432 {
8433 uint32 spell = aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
8434 CastSpell(this, spell, true, castItem, triggeredByAura);
8435 return true;
8436 }
8437 return false;
8438 }
8439 // Lightning Overload
8440 if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura
8441 {
8442 if (!procSpell || !IsPlayer() || !victim)
8443 return false;
8444
8445 uint32 spell = 45284;
8446
8447 // chain lightning only procs 1/3 of the time
8448 if (procSpell->SpellFamilyFlags[0] & 0x2)
8449 {
8450 if (!roll_chance_i(33))
8451 return false;
8452 spell = 45297;
8453 }
8454
8455 if (procEx & PROC_EX_CRITICAL_HIT)
8456 damage /= 2;
8457
8458 // do not reduce damage-spells have correct basepoints
8459 damage /= 2;
8460 int32 dmg = damage;
8461
8462 // Cast
8463 CastCustomSpell(victim, spell, &dmg, 0, 0, true, castItem, triggeredByAura);
8464 return true;
8465 }
8466 // Static Shock
8467 if (dummySpell->SpellIconID == 3059)
8468 {
8469 // Lightning Shield
8471 {
8472 uint32 spell = sSpellMgr->GetSpellWithRank(26364, aurEff->GetSpellInfo()->GetRank());
8473 CastSpell(target, spell, true, castItem, triggeredByAura);
8474 aurEff->GetBase()->DropCharge();
8475 return true;
8476 }
8477 return false;
8478 }
8479 break;
8480 }
8482 {
8483 // Improved Blood Presence
8484 if (dummySpell->SpellIconID == 2636)
8485 {
8486 if (!IsPlayer())
8487 return false;
8488 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8489 break;
8490 }
8491 // Butchery
8492 if (dummySpell->SpellIconID == 2664)
8493 {
8494 basepoints0 = triggerAmount;
8495 triggered_spell_id = 50163;
8496 target = this;
8497 break;
8498 }
8499 // Mark of Blood
8500 if (dummySpell->Id == 49005)
8501 {
8503 triggered_spell_id = 61607;
8504 break;
8505 }
8506 // Unholy Blight
8507 if (dummySpell->Id == 49194)
8508 {
8509 triggered_spell_id = 50536;
8510 SpellInfo const* unholyBlight = sSpellMgr->GetSpellInfo(triggered_spell_id);
8511 if (!unholyBlight || !victim)
8512 return false;
8513
8514 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8515
8516 //Glyph of Unholy Blight
8517 if (AuraEffect* glyph = GetAuraEffect(63332, 0))
8518 AddPct(basepoints0, glyph->GetAmount());
8519
8520 basepoints0 = basepoints0 / (unholyBlight->GetMaxDuration() / unholyBlight->Effects[0].Amplitude);
8521 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
8522 return true;
8523 }
8524 // Vendetta
8525 if (dummySpell->SpellFamilyFlags[0] & 0x10000)
8526 {
8527 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
8528 triggered_spell_id = 50181;
8529 target = this;
8530 break;
8531 }
8532 // Necrosis
8533 if (dummySpell->SpellIconID == 2709)
8534 {
8535 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8536 triggered_spell_id = 51460;
8537 break;
8538 }
8539 // Threat of Thassarian
8540 if (dummySpell->SpellIconID == 2023)
8541 {
8542 // Must Dual Wield
8543 if (!procSpell || !HasOffhandWeaponForAttack())
8544 return false;
8545 // Chance as basepoints for dummy aura
8546 if (!roll_chance_i(triggerAmount))
8547 return false;
8548
8549 switch (procSpell->Id)
8550 {
8551 // Obliterate
8552 case 49020:
8553 triggered_spell_id = 66198;
8554 break; // Rank 1
8555 case 51423:
8556 triggered_spell_id = 66972;
8557 break; // Rank 2
8558 case 51424:
8559 triggered_spell_id = 66973;
8560 break; // Rank 3
8561 case 51425:
8562 triggered_spell_id = 66974;
8563 break; // Rank 4
8564
8565 // Frost Strike
8566 case 49143:
8567 triggered_spell_id = 66196;
8568 break; // Rank 1
8569 case 51416:
8570 triggered_spell_id = 66958;
8571 break; // Rank 2
8572 case 51417:
8573 triggered_spell_id = 66959;
8574 break; // Rank 3
8575 case 51418:
8576 triggered_spell_id = 66960;
8577 break; // Rank 4
8578 case 51419:
8579 triggered_spell_id = 66961;
8580 break; // Rank 5
8581 case 55268:
8582 triggered_spell_id = 66962;
8583 break; // Rank 6
8584
8585 // Plague Strike
8586 case 45462:
8587 triggered_spell_id = 66216;
8588 break; // Rank 1
8589 case 49917:
8590 triggered_spell_id = 66988;
8591 break; // Rank 2
8592 case 49918:
8593 triggered_spell_id = 66989;
8594 break; // Rank 3
8595 case 49919:
8596 triggered_spell_id = 66990;
8597 break; // Rank 4
8598 case 49920:
8599 triggered_spell_id = 66991;
8600 break; // Rank 5
8601 case 49921:
8602 triggered_spell_id = 66992;
8603 break; // Rank 6
8604
8605 // Death Strike
8606 case 49998:
8607 triggered_spell_id = 66188;
8608 break; // Rank 1
8609 case 49999:
8610 triggered_spell_id = 66950;
8611 break; // Rank 2
8612 case 45463:
8613 triggered_spell_id = 66951;
8614 break; // Rank 3
8615 case 49923:
8616 triggered_spell_id = 66952;
8617 break; // Rank 4
8618 case 49924:
8619 triggered_spell_id = 66953;
8620 break; // Rank 5
8621
8622 // Rune Strike
8623 case 56815:
8624 triggered_spell_id = 66217;
8625 break; // Rank 1
8626
8627 // Blood Strike
8628 case 45902:
8629 triggered_spell_id = 66215;
8630 break; // Rank 1
8631 case 49926:
8632 triggered_spell_id = 66975;
8633 break; // Rank 2
8634 case 49927:
8635 triggered_spell_id = 66976;
8636 break; // Rank 3
8637 case 49928:
8638 triggered_spell_id = 66977;
8639 break; // Rank 4
8640 case 49929:
8641 triggered_spell_id = 66978;
8642 break; // Rank 5
8643 case 49930:
8644 triggered_spell_id = 66979;
8645 break; // Rank 6
8646 default:
8647 return false;
8648 }
8649
8650 // This should do, restore spell mod so next attack can also use this!
8651 // crit chance for first strike is already computed
8652 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 51124, nullptr); // Killing Machine
8653 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 49796, nullptr); // Deathchill
8654
8655 // Xinef: Somehow basepoints are divided by 2 which is later divided by 2 (offhand multiplier)
8656 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8657 if (triggerEntry->SchoolMask & SPELL_SCHOOL_MASK_NORMAL)
8658 basepoints0 = triggerEntry->Effects[EFFECT_0].BasePoints * 2;
8659
8660 SetCantProc(true);
8661 if (basepoints0)
8662 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8663 else
8664 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8665 SetCantProc(false);
8666 return true;
8667 }
8668 // Runic Power Back on Snare/Root
8669 if (dummySpell->Id == 61257)
8670 {
8671 // only for spells and hit/crit (trigger start always) and not start from self casted spells
8672 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
8673 return false;
8674 // Need snare or root mechanic
8675 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_SNARE))))
8676 return false;
8677 triggered_spell_id = 61258;
8678 target = this;
8679 break;
8680 }
8681 // Sudden Doom
8682 if (dummySpell->SpellIconID == 1939 && IsPlayer())
8683 {
8684 SpellChainNode const* chain = nullptr;
8685 // get highest rank of the Death Coil spell
8686 PlayerSpellMap const& sp_list = ToPlayer()->GetSpellMap();
8687 for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr)
8688 {
8689 // check if shown in spell book
8690 if (!itr->second->Active || !itr->second->IsInSpec(ToPlayer()->GetActiveSpec()) || itr->second->State == PLAYERSPELL_REMOVED)
8691 continue;
8692
8693 SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(itr->first);
8694 if (!spellProto)
8695 continue;
8696
8697 if (spellProto->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT
8698 && spellProto->SpellFamilyFlags[0] & 0x2000)
8699 {
8700 SpellChainNode const* newChain = sSpellMgr->GetSpellChainNode(itr->first);
8701
8702 // No chain entry or entry lower than found entry
8703 if (!chain || !newChain || (chain->rank < newChain->rank))
8704 {
8705 triggered_spell_id = itr->first;
8706 chain = newChain;
8707 }
8708 else
8709 continue;
8710 // Found spell is last in chain - do not need to look more
8711 // Optimisation for most common case
8712 if (chain && chain->last->Id == itr->first)
8713 break;
8714 }
8715 }
8716 }
8717 break;
8718 }
8719 case SPELLFAMILY_POTION:
8720 {
8721 // alchemist's stone
8722 if (dummySpell->Id == 17619)
8723 {
8724 if (procSpell->SpellFamilyName == SPELLFAMILY_POTION)
8725 {
8726 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; i++)
8727 {
8728 if (procSpell->Effects[i].Effect == SPELL_EFFECT_HEAL)
8729 {
8730 triggered_spell_id = 21399;
8731 }
8732 else if (procSpell->Effects[i].Effect == SPELL_EFFECT_ENERGIZE)
8733 {
8734 triggered_spell_id = 21400;
8735 }
8736 else
8737 continue;
8738
8739 basepoints0 = int32(CalculateSpellDamage(this, procSpell, i) * 0.4f);
8740 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, nullptr, triggeredByAura);
8741 }
8742 return true;
8743 }
8744 }
8745 break;
8746 }
8747 case SPELLFAMILY_PET:
8748 {
8749 switch (dummySpell->SpellIconID)
8750 {
8751 // Guard Dog
8752 case 201:
8753 {
8754 if (!victim)
8755 return false;
8756
8757 triggered_spell_id = 54445;
8758 target = this;
8759 float addThreat = float(CalculatePct(procSpell->Effects[0].CalcValue(this), triggerAmount));
8760 victim->AddThreat(this, addThreat);
8761 break;
8762 }
8763 // Silverback
8764 case 1582:
8765 triggered_spell_id = dummySpell->Id == 62765 ? 62801 : 62800;
8766 target = this;
8767 break;
8768 }
8769 break;
8770 }
8771 default:
8772 break;
8773 }
8774
8775 // if not handled by custom case, get triggered spell from dummySpell proto
8776 if (!triggered_spell_id)
8777 triggered_spell_id = dummySpell->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
8778
8779 // processed charge only counting case
8780 if (!triggered_spell_id)
8781 return true;
8782
8783 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8784 if (!triggerEntry)
8785 {
8786 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: Spell {} has non-existing triggered spell {}", dummySpell->Id, triggered_spell_id);
8787 return false;
8788 }
8789
8790 if (cooldown_spell_id == 0)
8791 cooldown_spell_id = triggered_spell_id;
8792
8793 if (cooldown)
8794 {
8795 if (HasSpellCooldown(cooldown_spell_id))
8796 return false;
8797
8798 AddSpellCooldown(cooldown_spell_id, 0, cooldown);
8799 }
8800
8801 if (basepoints0)
8802 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8803 else
8804 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8805
8806 return true;
8807}
@ PROC_EX_INTERNAL_HOT
Definition: SpellMgr.h:220
@ PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS
Definition: SpellMgr.h:128
@ PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS
Definition: SpellMgr.h:122
@ SPELL_AURA_PROC_TRIGGER_SPELL
Definition: SpellAuraDefines.h:105
@ SPELL_AURA_HASTE_SPELLS
Definition: SpellAuraDefines.h:279
@ SPELL_AURA_MOD_MELEE_HASTE
Definition: SpellAuraDefines.h:201
@ SPELL_AURA_MOD_DECREASE_SPEED
Definition: SpellAuraDefines.h:96
@ SPELL_AURA_PERIODIC_DUMMY
Definition: SpellAuraDefines.h:289
static First const & RAND(First const &first, Second const &second, Rest const &... rest)
Definition: CreatureAIImpl.h:25
EnchantmentSlot
Definition: Item.h:168
@ TEMP_ENCHANTMENT_SLOT
Definition: Item.h:170
WeaponAttackType
Definition: Unit.h:209
std::map< uint32, SpellCooldown > SpellCooldowns
Definition: Player.h:209
std::unordered_map< uint32, PlayerSpell * > PlayerSpellMap
Definition: Player.h:194
@ EQUIPMENT_SLOT_MAINHAND
Definition: Player.h:686
@ PLAYERSPELL_REMOVED
Definition: Player.h:122
@ SPELL_EFFECT_ENERGIZE
Definition: SharedDefines.h:819
@ LANG_UNIVERSAL
Definition: SharedDefines.h:746
@ CLASS_DRUID
Definition: SharedDefines.h:151
@ CLASS_SHAMAN
Definition: SharedDefines.h:147
@ CLASS_PRIEST
Definition: SharedDefines.h:145
@ CLASS_WARLOCK
Definition: SharedDefines.h:149
@ CLASS_MAGE
Definition: SharedDefines.h:148
@ CLASS_PALADIN
Definition: SharedDefines.h:142
@ CLASS_ROGUE
Definition: SharedDefines.h:144
@ MECHANIC_STUN
Definition: SharedDefines.h:1348
@ MECHANIC_ROOT
Definition: SharedDefines.h:1343
@ MECHANIC_SNARE
Definition: SharedDefines.h:1347
@ SPELLFAMILY_WARLOCK
Definition: SharedDefines.h:3799
@ SPELLFAMILY_PALADIN
Definition: SharedDefines.h:3804
@ SPELLFAMILY_HUNTER
Definition: SharedDefines.h:3803
@ SPELLFAMILY_POTION
Definition: SharedDefines.h:3807
@ SPELLFAMILY_ROGUE
Definition: SharedDefines.h:3802
@ SPELLFAMILY_DRUID
Definition: SharedDefines.h:3801
@ SPELLFAMILY_PET
Definition: SharedDefines.h:3811
@ REP_EXALTED
Definition: SharedDefines.h:187
@ SPELL_SCHOOL_MASK_SHADOW
Definition: SharedDefines.h:313
@ SPELL_SCHOOL_MASK_FIRE
Definition: SharedDefines.h:310
@ SPELL_SCHOOL_MASK_FROST
Definition: SharedDefines.h:312
constexpr auto IN_MILLISECONDS
Definition: Common.h:53
T ApplyPct(T &base, U pct)
Definition: Util.h:73
int32 irand(int32 min, int32 max)
Definition: Random.cpp:37
uint8 GetSlot() const
Definition: Item.h:281
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition: Item.h:304
bool IsEquipped() const
Definition: Item.cpp:789
void SetSpellModTakingSpell(Spell *spell, bool apply)
Definition: Player.cpp:10124
void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition: Player.cpp:9972
bool HasSpellCooldown(uint32 spell_id) const override
Definition: Player.cpp:16370
PlayerSpellMap const & GetSpellMap() const
Definition: Player.h:1768
void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
Definition: Player.cpp:11124
SpellCooldowns GetSpellCooldowns() const
Definition: Player.h:2168
static uint8 GetAttackBySlot(uint8 slot)
Definition: PlayerStorage.cpp:542
ReputationRank GetReputationRank(uint32 faction_id) const
Definition: Player.cpp:5898
Unit * GetSelectedUnit() const
Definition: Player.cpp:11566
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition: Player.cpp:3548
void Say(std::string_view text, Language language, WorldObject const *=nullptr) override
Handles said message in regular chat based on declared language and in config pre-defined Range.
Definition: Player.cpp:9425
Item * GetItemByGuid(ObjectGuid guid) const
Definition: PlayerStorage.cpp:407
Spell * m_spellModTakingSpell
Definition: Player.h:2555
Definition: Unit.h:374
uint32 GetEffectiveHeal() const
Definition: Unit.h:414
uint32 GetCreatePowers(Powers power) const
Definition: Unit.cpp:15747
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5646
void RemoveAurasWithMechanic(uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
Definition: Unit.cpp:5318
int32 CalculateSpellDamage(Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
Definition: Unit.cpp:14952
void SetCantProc(bool apply)
Definition: Unit.cpp:17369
bool HealthBelowPct(int32 pct) const
Definition: Unit.h:1041
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4974
int32 SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask, bool isDoT=false)
Definition: Unit.cpp:12068
bool IsFriendlyTo(Unit const *unit) const
Definition: Unit.cpp:10311
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:12029
uint32 CountPctFromMaxHealth(int32 pct) const
Definition: Unit.h:1046
void CastDelayedSpellWithPeriodicAmount(Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
Definition: Unit.cpp:20154
Powers getPowerType() const
Definition: Unit.h:1056
void RemoveMovementImpairingAuras(bool withRoot)
Definition: Unit.cpp:5299
SpellInfo const * GetSpellInfo() const
Definition: Spell.h:587
int32 GetPowerCost() const
Definition: Spell.h:588
uint32 ProcChance
Definition: SpellInfo.h:356
Definition: SpellMgr.h:554
SpellInfo const * last
Definition: SpellMgr.h:558
uint8 rank
Definition: SpellMgr.h:559

References AddPct(), Player::AddSpellCooldown(), AddSpellCooldown(), AddThreat(), ApplyPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, SpellInfo::CalcPowerCost(), CalculatePct(), CalculateSpellDamage(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CountPctFromMaxHealth(), CURRENT_GENERIC_SPELL, EFFECT_0, EFFECT_1, SpellInfo::Effects, ObjectGuid::Empty, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, SpellInfo::EquippedItemClass, SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), Player::GetAttackBySlot(), GetAttackTime(), GetAura(), GetAuraEffect(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraEffect::GetCaster(), Aura::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetCharges(), getClass(), GetCreateMana(), GetCreatePowers(), WorldObject::GetDistance(), Aura::GetDuration(), Aura::GetEffect(), HealInfo::GetEffectiveHeal(), AuraEffect::GetEffIndex(), Item::GetEnchantmentId(), GameTime::GetGameTime(), Player::GetGroup(), GetGuardianPet(), Object::GetGUID(), ProcEventInfo::GetHealInfo(), Player::GetItemByGuid(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), GetMaxPower(), GetOwner(), Spell::GetPowerCost(), getPowerType(), ProcEventInfo::GetProcSpell(), Player::GetReputationRank(), SpellInfo::GetSchoolMask(), Player::GetSelectedUnit(), Item::GetSlot(), Player::GetSpellCooldowns(), AuraEffect::GetSpellInfo(), Player::GetSpellMap(), Aura::GetStackAmount(), GetVictim(), HasActivePowerType(), HasAura(), Position::HasInArc(), HasOffhandWeaponForAttack(), Player::HasSpellCooldown(), HasSpellCooldown(), HealthBelowPct(), SpellInfo::Id, IN_MILLISECONDS, irand(), IsAlive(), Object::IsCreature(), Item::IsEquipped(), IsFriendlyTo(), Object::IsPlayer(), SpellInfo::IsPositive(), SpellInfo::IsRankOf(), LANG_UNIVERSAL, SpellChainNode::last, LOG_ERROR, m_currentSpells, Player::m_spellModTakingSpell, SpellInfo::ManaCost, MAX_SPELL_EFFECTS, MECHANIC_ROOT, MECHANIC_SNARE, MECHANIC_STUN, OFF_ATTACK, PLAYERSPELL_REMOVED, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, PROC_EX_CRITICAL_HIT, PROC_EX_INTERNAL_HOT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, SpellInfo::ProcChance, RAND(), SpellChainNode::rank, RemoveAuraFromStack(), RemoveAurasByType(), RemoveAurasDueToSpell(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), Player::RemoveSpellCooldown(), REP_EXALTED, Player::RestoreSpellMods(), roll_chance_f(), roll_chance_i(), Player::Say(), SpellInfo::SchoolMask, AuraEffect::SetAmount(), SetCantProc(), Aura::SetDuration(), Aura::SetMaxDuration(), Player::SetSpellModTakingSpell(), SPELL_AURA_DUMMY, SPELL_AURA_HASTE_SPELLS, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_DUMMY, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_EFFECT_ENERGIZE, SPELL_EFFECT_HEAL, SPELL_SCHOOL_MASK_FIRE, SPELL_SCHOOL_MASK_FROST, SPELL_SCHOOL_MASK_NORMAL, SPELL_SCHOOL_MASK_SHADOW, SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PET, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, SpellInfo::SpellVisual, sSpellMgr, TEMP_ENCHANTMENT_SLOT, Object::ToPlayer(), and urand().

Referenced by ProcDamageAndSpellFor().

◆ HandleEmoteCommand()

void Unit::HandleEmoteCommand ( uint32  emoteId)
2033{
2035 packet.EmoteID = emoteId;
2036 packet.Guid = GetGUID();
2037 SendMessageToSet(packet.Write(), true);
2038}
Definition: ChatPackets.h:29
WorldPacket const * Write() override
Definition: ChatPackets.cpp:20
uint32 EmoteID
Definition: ChatPackets.h:35
ObjectGuid Guid
Definition: ChatPackets.h:36

References WorldPackets::Chat::Emote::EmoteID, Object::GetGUID(), WorldPackets::Chat::Emote::Guid, WorldObject::SendMessageToSet(), and WorldPackets::Chat::Emote::Write().

Referenced by npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_viscidus::DamageTaken(), DealMeleeDamage(), boss_twinemperorsAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), boss_felblood_kaelthas::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), StandUpEvent::Execute(), PartyTimeEmoteEvent::Execute(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), WorldSession::HandleEmoteOpcode(), spell_chapter5_return_to_capital::HandleHit(), npc_commandscript::HandleNpcSayCommand(), npc_commandscript::HandleNpcYellCommand(), WorldSession::HandleTextEmoteOpcode(), npc_maiev_illidan::IsSummonedBy(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_sentinel_leader::MovementInform(), npc_sentinel_infiltrator::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_akama_illidan::MovementInform(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::MovementInform(), boss_felmyst::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), spell_gen_spectator_cheer_trigger::PrepareSpellScript(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), PetAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_felmyst::ScheduleGroundAbilities(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), CreatureTextMgr::SendEmote(), boss_grand_warlock_nethekurse::SetData(), npc_harrison_jones::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_felmyst::StartIntro(), boss_ahune::Submerge(), boss_nightbane::TriggerHealthTakeOff(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_shenthul::npc_shenthulAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_highlord_tirion_fordring_lh::npc_highlord_tirion_fordringAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_valiance_keep_cannoneer::npc_valiance_keep_cannoneerAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_dancing_flames::npc_dancing_flamesAI::UpdateAI(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::UpdateAI(), npc_rocknot::npc_rocknotAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_taretha::npc_tarethaAI::WaypointReached(), npc_general_andorov::WaypointReached(), npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached(), npc_engineer_helice::npc_engineer_heliceAI::WaypointReached(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::WaypointReached(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ HandleOverrideClassScriptAuraProc()

bool Unit::HandleOverrideClassScriptAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  cooldown 
)
private
9932{
9933 int32 scriptId = triggeredByAura->GetMiscValue();
9934
9935 if (!victim || !victim->IsAlive())
9936 return false;
9937
9938 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
9939 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
9940
9941 uint32 triggered_spell_id = 0;
9942
9943 switch (scriptId)
9944 {
9945 case 836: // Improved Blizzard (Rank 1)
9946 {
9947 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9948 return false;
9949 triggered_spell_id = 12484;
9950 break;
9951 }
9952 case 988: // Improved Blizzard (Rank 2)
9953 {
9954 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9955 return false;
9956 triggered_spell_id = 12485;
9957 break;
9958 }
9959 case 989: // Improved Blizzard (Rank 3)
9960 {
9961 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9962 return false;
9963 triggered_spell_id = 12486;
9964 break;
9965 }
9966 case 4533: // Dreamwalker Raiment 2 pieces bonus
9967 {
9968 // Chance 50%
9969 if (!roll_chance_i(50))
9970 return false;
9971
9972 switch (victim->getPowerType())
9973 {
9974 case POWER_MANA:
9975 triggered_spell_id = 28722;
9976 break;
9977 case POWER_RAGE:
9978 triggered_spell_id = 28723;
9979 break;
9980 case POWER_ENERGY:
9981 triggered_spell_id = 28724;
9982 break;
9983 default:
9984 return false;
9985 }
9986 break;
9987 }
9988 case 4537: // Dreamwalker Raiment 6 pieces bonus
9989 triggered_spell_id = 28750; // Blessing of the Claw
9990 break;
9991 case 5497: // Improved Mana Gems
9992 triggered_spell_id = 37445; // Mana Surge
9993 break;
9994 case 7010: // Revitalize - can proc on full hp target
9995 case 7011:
9996 case 7012:
9997 {
9998 if (!roll_chance_i(triggeredByAura->GetAmount()))
9999 return false;
10000 switch (victim->getPowerType())
10001 {
10002 case POWER_MANA:
10003 triggered_spell_id = 48542;
10004 break;
10005 case POWER_RAGE:
10006 triggered_spell_id = 48541;
10007 break;
10008 case POWER_ENERGY:
10009 triggered_spell_id = 48540;
10010 break;
10011 case POWER_RUNIC_POWER:
10012 triggered_spell_id = 48543;
10013 break;
10014 default:
10015 break;
10016 }
10017 break;
10018 }
10019 default:
10020 break;
10021 }
10022
10023 // not processed
10024 if (!triggered_spell_id)
10025 return false;
10026
10027 // standard non-dummy case
10028 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
10029
10030 if (!triggerEntry)
10031 {
10032 LOG_ERROR("entities.unit", "Unit::HandleOverrideClassScriptAuraProc: Spell {} triggering for class script id {}", triggered_spell_id, scriptId);
10033 return false;
10034 }
10035
10036 if (cooldown)
10037 {
10038 if (HasSpellCooldown(triggered_spell_id))
10039 return false;
10040
10041 AddSpellCooldown(triggered_spell_id, 0, cooldown);
10042 }
10043
10044 CastSpell(victim, triggered_spell_id, true, castItem, triggeredByAura);
10045
10046 return true;
10047}

References AddSpellCooldown(), CastSpell(), AuraEffect::GetAmount(), AuraEffect::GetBase(), Aura::GetCastItemGUID(), Player::GetItemByGuid(), AuraEffect::GetMiscValue(), getPowerType(), HasSpellCooldown(), IsAlive(), Object::IsPlayer(), LOG_ERROR, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, roll_chance_i(), SpellInfo::SpellVisual, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleProcExtraAttackFor()

void Unit::HandleProcExtraAttackFor ( Unit victim,
uint32  count 
)
2793{
2794 while (count)
2795 {
2796 --count;
2797 AttackerStateUpdate(victim, BASE_ATTACK, true);
2798 }
2799}
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition: Unit.cpp:2597

References AttackerStateUpdate(), and BASE_ATTACK.

Referenced by Update().

◆ HandleProcTriggerSpell()

bool Unit::HandleProcTriggerSpell ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
uint32  procPhase,
ProcEventInfo eventInfo 
)
private
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
9007{
9008 // Get triggered aura spell info
9009 SpellInfo const* auraSpellInfo = triggeredByAura->GetSpellInfo();
9010
9011 // Basepoints of trigger aura
9012 int32 triggerAmount = triggeredByAura->GetAmount();
9013
9014 // Set trigger spell id, target, custom basepoints
9015 uint32 trigger_spell_id = auraSpellInfo->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
9016
9017 Unit* target = nullptr;
9018 int32 basepoints0 = 0;
9019
9020 if (triggeredByAura->GetAuraType() == SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE)
9021 basepoints0 = triggerAmount;
9022
9023 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
9024 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
9025
9026 // Try handle unknown trigger spells
9027 //if (sSpellMgr->GetSpellInfo(trigger_spell_id) == nullptr)
9028 {
9029 switch (auraSpellInfo->SpellFamilyName)
9030 {
9032 switch (auraSpellInfo->Id)
9033 {
9034 case 43820: // Charm of the Witch Doctor (Amani Charm of the Witch Doctor trinket)
9035 // Pct value stored in dummy
9036 if (!victim)
9037 return false;
9038 basepoints0 = victim->GetCreateHealth() * auraSpellInfo->Effects[1].CalcValue() / 100;
9039 target = victim;
9040 break;
9041 case 57345: // Darkmoon Card: Greatness
9042 {
9043 float stat = 0.0f;
9044 // strength
9045 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 60229; stat = GetStat(STAT_STRENGTH); }
9046 // agility
9047 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 60233; stat = GetStat(STAT_AGILITY); }
9048 // intellect
9049 if (GetStat(STAT_INTELLECT) > stat) { trigger_spell_id = 60234; stat = GetStat(STAT_INTELLECT);}
9050 // spirit
9051 if (GetStat(STAT_SPIRIT) > stat) { trigger_spell_id = 60235; }
9052 break;
9053 }
9054 case 67702: // Death's Choice, Item - Coliseum 25 Normal Melee Trinket
9055 {
9056 if (!damage)
9057 return false;
9058 float stat = 0.0f;
9059 // strength
9060 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67708; stat = GetStat(STAT_STRENGTH); }
9061 // agility
9062 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67703; }
9063 break;
9064 }
9065 case 67771: // Death's Choice (heroic), Item - Coliseum 25 Heroic Melee Trinket
9066 {
9067 if (!damage)
9068 return false;
9069 float stat = 0.0f;
9070 // strength
9071 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67773; stat = GetStat(STAT_STRENGTH); }
9072 // agility
9073 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67772; }
9074 break;
9075 }
9076 case 27522: // Mana Drain Trigger
9077 case 40336: // Mana Drain Trigger
9078 case 46939: // Black Bow of the Betrayer
9079 {
9080 // On successful melee or ranged attack gain $29471s1 mana and if possible drain $27526s1 mana from the target.
9081 if (IsAlive())
9082 CastSpell(this, 29471, true, castItem, triggeredByAura);
9083 if (victim && victim->IsAlive())
9084 CastSpell(victim, 27526, true, castItem, triggeredByAura);
9085 return true;
9086 }
9087 // Forge of Souls, Devourer of Souls, Mirrored Soul
9088 case 69023:
9089 {
9090 int32 dmg = damage * 0.45f;
9091 if (dmg > 0)
9092 if (Aura* a = GetAura(69023))
9093 if (Unit* c = a->GetCaster())
9094 CastCustomSpell(c, 69034, &dmg, 0, 0, true);
9095 return true;
9096 }
9097 // Soul-Trader Beacon proc aura
9098 case 50051:
9099 {
9100 if (!victim)
9101 return false;
9102
9103 if (Creature* cr = GetCompanionPet())
9104 cr->CastSpell(victim, 50101, true);
9105
9106 return false;
9107 }
9108 }
9109 break;
9110 case SPELLFAMILY_MAGE:
9111 if (auraSpellInfo->SpellIconID == 2127) // Blazing Speed
9112 {
9113 switch (auraSpellInfo->Id)
9114 {
9115 case 31641: // Rank 1
9116 case 31642: // Rank 2
9117 trigger_spell_id = 31643;
9118 break;
9119 default:
9120 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Blazing Speed", auraSpellInfo->Id);
9121 return false;
9122 }
9123 }
9124 else if (auraSpellInfo->Id == 71761) // Deep Freeze Immunity State (only permanent)
9125 {
9126 Creature* creature = victim->ToCreature();
9127 if (!creature || !creature->HasMechanicTemplateImmunity(1 << (MECHANIC_STUN - 1)))
9128 return false;
9129 }
9130 break;
9132 {
9133 // Nether Protection
9134 if (auraSpellInfo->SpellIconID == 1985)
9135 {
9136 if (!procSpell)
9137 return false;
9138 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9139 {
9141 return false; // ignore
9142 case SPELL_SCHOOL_HOLY:
9143 trigger_spell_id = 54370;
9144 break;
9145 case SPELL_SCHOOL_FIRE:
9146 trigger_spell_id = 54371;
9147 break;
9149 trigger_spell_id = 54375;
9150 break;
9151 case SPELL_SCHOOL_FROST:
9152 trigger_spell_id = 54372;
9153 break;
9155 trigger_spell_id = 54374;
9156 break;
9158 trigger_spell_id = 54373;
9159 break;
9160 default:
9161 return false;
9162 }
9163 }
9164 break;
9165 }
9166 case SPELLFAMILY_PRIEST:
9167 {
9168 // Blessed Recovery
9169 if (auraSpellInfo->SpellIconID == 1875)
9170 {
9171 switch (auraSpellInfo->Id)
9172 {
9173 case 27811:
9174 trigger_spell_id = 27813;
9175 break;
9176 case 27815:
9177 trigger_spell_id = 27817;
9178 break;
9179 case 27816:
9180 trigger_spell_id = 27818;
9181 break;
9182 default:
9183 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in BR", auraSpellInfo->Id);
9184 return false;
9185 }
9186 basepoints0 = CalculatePct(int32(damage), triggerAmount) / 3;
9187 target = this;
9188 // Add remaining ticks to healing done
9189 CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
9190 return true;
9191 }
9192 break;
9193 }
9194 case SPELLFAMILY_DRUID:
9195 {
9196 switch (auraSpellInfo->Id)
9197 {
9198 // Druid Forms Trinket
9199 case 37336:
9200 {
9201 switch (GetShapeshiftForm())
9202 {
9203 case FORM_NONE:
9204 trigger_spell_id = 37344;
9205 break;
9206 case FORM_CAT:
9207 trigger_spell_id = 37341;
9208 break;
9209 case FORM_BEAR:
9210 case FORM_DIREBEAR:
9211 trigger_spell_id = 37340;
9212 break;
9213 case FORM_TREE:
9214 trigger_spell_id = 37342;
9215 break;
9216 case FORM_MOONKIN:
9217 trigger_spell_id = 37343;
9218 break;
9219 default:
9220 return false;
9221 }
9222 break;
9223 }
9224 // Druid T9 Feral Relic (Lacerate, Swipe, Mangle, and Shred)
9225 case 67353:
9226 {
9227 switch (GetShapeshiftForm())
9228 {
9229 case FORM_CAT:
9230 trigger_spell_id = 67355;
9231 break;
9232 case FORM_BEAR:
9233 case FORM_DIREBEAR:
9234 trigger_spell_id = 67354;
9235 break;
9236 default:
9237 return false;
9238 }
9239 break;
9240 }
9241 default:
9242 break;
9243 }
9244 break;
9245 }
9246 case SPELLFAMILY_HUNTER:
9247 {
9248 if (auraSpellInfo->SpellIconID == 3247) // Piercing Shots
9249 {
9250 if (!victim)
9251 return false;
9252
9253 switch (auraSpellInfo->Id)
9254 {
9255 case 53234: // Rank 1
9256 case 53237: // Rank 2
9257 case 53238: // Rank 3
9258 trigger_spell_id = 63468;
9259 break;
9260 default:
9261 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Piercing Shots", auraSpellInfo->Id);
9262 return false;
9263 }
9264 SpellInfo const* TriggerPS = sSpellMgr->GetSpellInfo(trigger_spell_id);
9265 if (!TriggerPS)
9266 return false;
9267
9268 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (TriggerPS->GetMaxDuration() / TriggerPS->Effects[0].Amplitude);
9269 victim->CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
9270 return true;
9271 }
9272 // Item - Hunter T9 4P Bonus (Steady Shot)
9273 else if (auraSpellInfo->Id == 67151)
9274 {
9275 if (!IsPlayer() || !ToPlayer()->GetPet())
9276 return false;
9277
9278 target = ToPlayer()->GetPet();
9279 trigger_spell_id = 68130;
9280 break;
9281 }
9282 break;
9283 }
9285 {
9286 switch (auraSpellInfo->Id)
9287 {
9288 // Soul Preserver
9289 case 60510:
9290 {
9291 switch (getClass())
9292 {
9293 case CLASS_DRUID:
9294 trigger_spell_id = 60512;
9295 break;
9296 case CLASS_PALADIN:
9297 trigger_spell_id = 60513;
9298 break;
9299 case CLASS_PRIEST:
9300 trigger_spell_id = 60514;
9301 break;
9302 case CLASS_SHAMAN:
9303 trigger_spell_id = 60515;
9304 break;
9305 }
9306
9307 target = this;
9308 break;
9309 }
9310 case 37657: // Lightning Capacitor
9311 case 54841: // Thunder Capacitor
9312 case 67712: // Item - Coliseum 25 Normal Caster Trinket
9313 case 67758: // Item - Coliseum 25 Heroic Caster Trinket
9314 {
9315 if (!victim || !victim->IsAlive() || !IsPlayer())
9316 return false;
9317
9318 uint32 stack_spell_id = 0;
9319 switch (auraSpellInfo->Id)
9320 {
9321 case 37657:
9322 stack_spell_id = 37658;
9323 trigger_spell_id = 37661;
9324 break;
9325 case 54841:
9326 stack_spell_id = 54842;
9327 trigger_spell_id = 54843;
9328 break;
9329 case 67712:
9330 stack_spell_id = 67713;
9331 trigger_spell_id = 67714;
9332 break;
9333 case 67758:
9334 stack_spell_id = 67759;
9335 trigger_spell_id = 67760;
9336 break;
9337 }
9338
9339 if (cooldown && ToPlayer()->HasSpellCooldown(stack_spell_id))
9340 {
9341 return false;
9342 }
9343
9344 CastSpell(this, stack_spell_id, true, nullptr, triggeredByAura);
9345
9346 Aura* dummy = GetAura(stack_spell_id);
9347 if (!dummy || dummy->GetStackAmount() < triggerAmount)
9348 {
9349 return false;
9350 }
9351
9352 if (cooldown)
9353 {
9354 ToPlayer()->AddSpellCooldown(stack_spell_id, 0, cooldown);
9355 }
9356 RemoveAurasDueToSpell(stack_spell_id);
9357 CastSpell(victim, trigger_spell_id, true, nullptr, triggeredByAura);
9358 return true;
9359 }
9360 default:
9361 // Illumination
9362 if (auraSpellInfo->SpellIconID == 241)
9363 {
9364 if (!procSpell)
9365 return false;
9366 // procspell is triggered spell but we need mana cost of original casted spell
9367 uint32 originalSpellId = procSpell->Id;
9368 // Holy Shock heal
9369 if (procSpell->SpellFamilyFlags[1] & 0x00010000)
9370 {
9371 switch (procSpell->Id)
9372 {
9373 case 25914:
9374 originalSpellId = 20473;
9375 break;
9376 case 25913:
9377 originalSpellId = 20929;
9378 break;
9379 case 25903:
9380 originalSpellId = 20930;
9381 break;
9382 case 27175:
9383 originalSpellId = 27174;
9384 break;
9385 case 33074:
9386 originalSpellId = 33072;
9387 break;
9388 case 48820:
9389 originalSpellId = 48824;
9390 break;
9391 case 48821:
9392 originalSpellId = 48825;
9393 break;
9394 default:
9395 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in HShock", procSpell->Id);
9396 return false;
9397 }
9398 }
9399 SpellInfo const* originalSpell = sSpellMgr->GetSpellInfo(originalSpellId);
9400 if (!originalSpell)
9401 {
9402 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} unknown but selected as original in Illu", originalSpellId);
9403 return false;
9404 }
9405 // percent stored in effect 1 (class scripts) base points
9406 int32 cost = int32(originalSpell->ManaCost + CalculatePct(GetCreateMana(), originalSpell->ManaCostPercentage));
9407 basepoints0 = CalculatePct(cost, auraSpellInfo->Effects[1].CalcValue());
9408 trigger_spell_id = 20272;
9409 target = this;
9410 }
9411 break;
9412 }
9413 break;
9414 }
9415 case SPELLFAMILY_SHAMAN:
9416 {
9417 // Lightning Shield (overwrite non existing triggered spell call in spell.dbc
9418 if (auraSpellInfo->SpellFamilyFlags[0] & 0x400 && auraSpellInfo->HasAttribute(SPELL_ATTR1_NO_THREAT))
9419 {
9420 // Do not proc off from self-casted items
9421 if (Spell const* spell = eventInfo.GetProcSpell())
9422 {
9423 if (spell->m_castItemGUID && victim->GetGUID() == GetGUID())
9424 {
9425 return false;
9426 }
9427 }
9428
9429 trigger_spell_id = sSpellMgr->GetSpellWithRank(26364, auraSpellInfo->GetRank());
9430 }
9431 // Nature's Guardian
9432 else if (auraSpellInfo->SpellIconID == 2013)
9433 {
9434 // Check health condition - should drop to less 30% (damage deal after this!)
9435 if (!HealthBelowPctDamaged(30, damage))
9436 return false;
9437
9438 if (victim && victim->IsAlive())
9439 victim->GetThreatMgr().ModifyThreatByPercent(this, -10);
9440
9441 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
9442 trigger_spell_id = 31616;
9443 target = this;
9444 }
9445 break;
9446 }
9448 {
9449 // Acclimation
9450 if (auraSpellInfo->SpellIconID == 1930)
9451 {
9452 if (!procSpell)
9453 return false;
9454 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9455 {
9457 return false; // ignore
9458 case SPELL_SCHOOL_HOLY:
9459 trigger_spell_id = 50490;
9460 break;
9461 case SPELL_SCHOOL_FIRE:
9462 trigger_spell_id = 50362;
9463 break;
9465 trigger_spell_id = 50488;
9466 break;
9467 case SPELL_SCHOOL_FROST:
9468 trigger_spell_id = 50485;
9469 break;
9471 trigger_spell_id = 50489;
9472 break;
9474 trigger_spell_id = 50486;
9475 break;
9476 default:
9477 return false;
9478 }
9479 }
9480 // Blood Presence (Improved)
9481 else if (auraSpellInfo->Id == 63611)
9482 {
9483 if (!IsPlayer())
9484 return false;
9485
9486 trigger_spell_id = 50475;
9487 basepoints0 = CalculatePct(int32(damage), triggerAmount);
9488 }
9489 break;
9490 }
9491 }
9492 }
9493
9494 // All ok. Check current trigger spell
9495 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(trigger_spell_id);
9496 if (!triggerEntry)
9497 {
9498 // Don't cast unknown spell
9499 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} (effIndex: {}) has unknown TriggerSpell {}. Unhandled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex(), trigger_spell_id);
9500 return false;
9501 }
9502
9503 // not allow proc extra attack spell at extra attack
9504 if (triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS))
9505 {
9506 uint32 lastExtraAttackSpell = eventInfo.GetActor()->GetLastExtraAttackSpell();
9507
9508 // Patch 1.12.0(?) extra attack abilities can no longer chain proc themselves
9509 if (lastExtraAttackSpell == trigger_spell_id)
9510 {
9511 return false;
9512 }
9513
9514 // Patch 2.2.0 Sword Specialization (Warrior, Rogue) extra attack can no longer proc additional extra attacks
9515 // 3.3.5 Sword Specialization (Warrior), Hack and Slash (Rogue)
9516 if (lastExtraAttackSpell == SPELL_SWORD_SPECIALIZATION || lastExtraAttackSpell == SPELL_HACK_AND_SLASH)
9517 {
9518 return false;
9519 }
9520 }
9521
9522 // Custom requirements (not listed in procEx) Warning! damage dealing after this
9523 // Custom triggered spells
9524 switch (auraSpellInfo->Id)
9525 {
9526 // Deep Wounds
9527 case 12834:
9528 case 12849:
9529 case 12867:
9530 {
9531 if (!IsPlayer())
9532 return false;
9533
9534 if (procFlags & PROC_FLAG_DONE_OFFHAND_ATTACK)
9536 else
9538 break;
9539 }
9540 // Persistent Shield (Scarab Brooch trinket)
9541 // This spell originally trigger 13567 - Dummy Trigger (vs dummy efect)
9542 case 26467:
9543 {
9544 basepoints0 = int32(CalculatePct(damage, 15));
9545 target = victim;
9546 trigger_spell_id = 26470;
9547 break;
9548 }
9549 // Unyielding Knights (item exploit 29108\29109)
9550 case 38164:
9551 {
9552 if (!victim || victim->GetEntry() != 19457) // Proc only if your target is Grillok
9553 return false;
9554 break;
9555 }
9556 // Deflection
9557 case 52420:
9558 {
9559 if (!HealthBelowPct(35))
9560 return false;
9561 break;
9562 }
9563
9564 // Cheat Death
9565 case 28845:
9566 {
9567 // When your health drops below 20%
9568 if (HealthBelowPctDamaged(20, damage) || HealthBelowPct(20))
9569 return false;
9570 break;
9571 }
9572 // Deadly Swiftness (Rank 1)
9573 case 31255:
9574 {
9575 // whenever you deal damage to a target who is below 20% health.
9576 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(20))
9577 return false;
9578
9579 target = this;
9580 trigger_spell_id = 22588;
9581 [[fallthrough]];
9582 }
9583 // Bonus Healing (Crystal Spire of Karabor mace)
9584 case 40971:
9585 {
9586 // If your target is below $s1% health
9587 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(triggerAmount))
9588 return false;
9589 break;
9590 }
9591 // Rapid Recuperation
9592 case 53228:
9593 case 53232:
9594 {
9595 // This effect only from Rapid Fire (ability cast)
9596 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x20))
9597 return false;
9598 break;
9599 }
9600 // Decimation
9601 case 63156:
9602 case 63158:
9603 // Can proc only if target has hp below 35%
9604 if (!victim || !victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, procSpell, this))
9605 return false;
9606 break;
9607 // Ulduar, Hodir, Toasty Fire
9608 case 62821:
9609 if (!this->IsPlayer()) // spell has Attribute, but persistent area auras ignore it
9610 return false;
9611 break;
9612 case 15337: // Improved Spirit Tap (Rank 1)
9613 case 15338: // Improved Spirit Tap (Rank 2)
9614 {
9615 if (!procSpell)
9616 return false;
9617
9618 if (procSpell->SpellFamilyFlags[0] & 0x800000)
9619 if ((procSpell->Id != 58381) || !roll_chance_i(50))
9620 return false;
9621
9622 target = victim;
9623 break;
9624 }
9625 // Professor Putricide - Ooze Spell Tank Protection
9626 case 71770:
9627 if (victim)
9628 victim->CastSpell(victim, trigger_spell_id, true); // EffectImplicitTarget is self
9629 return true;
9630 case 45057: // Evasive Maneuvers (Commendation of Kael`thas trinket)
9631 case 71634: // Item - Icecrown 25 Normal Tank Trinket 1
9632 case 71640: // Item - Icecrown 25 Heroic Tank Trinket 1
9633 case 75475: // Item - Chamber of Aspects 25 Normal Tank Trinket
9634 case 75481: // Item - Chamber of Aspects 25 Heroic Tank Trinket
9635 {
9636 // Procs only if damage takes health below $s1%
9637 if (!HealthBelowPctDamaged(triggerAmount, damage))
9638 return false;
9639 break;
9640 }
9641 default:
9642 break;
9643 }
9644
9645 if (auraSpellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
9646 {
9647 // Xinef: keep this order, Aura 70656 has SpellIconID 85!
9648 // Item - Death Knight T10 Melee 4P Bonus
9649 if (auraSpellInfo->Id == 70656)
9650 {
9652 return false;
9653
9654 for (uint8 i = 0; i < MAX_RUNES; ++i)
9655 if (ToPlayer()->GetRuneCooldown(i) == 0)
9656 return false;
9657 }
9658 // Blade Barrier
9659 else if (auraSpellInfo->SpellIconID == 85)
9660 {
9661 Player* plr = ToPlayer();
9662 if (!plr || !plr->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY) || !procSpell)
9663 return false;
9664
9666 return false;
9667 }
9668 // Rime
9669 else if (auraSpellInfo->SpellIconID == 56)
9670 {
9671 if (!IsPlayer())
9672 return false;
9673
9674 // Howling Blast
9676 }
9677 }
9678
9679 // Custom basepoints/target for exist spell
9680 // dummy basepoints or other customs
9681 switch (trigger_spell_id)
9682 {
9683 // Auras which should proc on area aura source (caster in this case):
9684 // Turn the Tables
9685 case 52914:
9686 case 52915:
9687 case 52910:
9688 // Honor Among Thieves
9689 case 51699:
9690 {
9691 target = triggeredByAura->GetBase()->GetCaster();
9692 if (!target)
9693 return false;
9694
9695 if (Player* pTarget = target->ToPlayer())
9696 {
9697 if (cooldown)
9698 {
9699 if (pTarget->HasSpellCooldown(trigger_spell_id))
9700 return false;
9701 pTarget->AddSpellCooldown(trigger_spell_id, 0, cooldown);
9702 }
9703
9704 Unit* cptarget = nullptr;
9705 if (trigger_spell_id == 51699)
9706 {
9707 cptarget = pTarget->GetComboTarget();
9708 if (!cptarget)
9709 {
9710 cptarget = pTarget->GetSelectedUnit();
9711 }
9712 }
9713 else
9714 cptarget = target;
9715
9716 if (cptarget)
9717 {
9718 target->CastSpell(cptarget, trigger_spell_id, true);
9719 return true;
9720 }
9721 }
9722 return false;
9723 }
9724 // Cast positive spell on enemy target
9725 case 20233: // Improved Lay on Hands (cast on target)
9726 {
9727 target = victim;
9728 break;
9729 }
9730 // Ruby Drake, Evasive Aura
9731 case 50241:
9732 {
9733 if (GetAura(50240))
9734 return false;
9735
9736 break;
9737 }
9738 // Combo points add triggers (need add combopoint only for main target, and after possible combopoints reset)
9739 case 15250: // Rogue Setup
9740 {
9741 // applied only for main target
9742 if (!victim || (IsPlayer() && victim != ToPlayer()->GetSelectedUnit()))
9743 return false;
9744 break; // continue normal case
9745 }
9746 // Finish movies that add combo
9747 case 14189: // Seal Fate (Netherblade set)
9748 case 14157: // Ruthlessness
9749 {
9750 victim = nullptr;
9751 // Need add combopoint AFTER finish movie (or they dropped in finish phase)
9752 break;
9753 }
9754 // Item - Druid T10 Balance 2P Bonus
9755 case 16870:
9756 {
9757 if (HasAura(70718))
9758 CastSpell(this, 70721, true);
9759 RemoveAurasDueToSpell(trigger_spell_id);
9760 break;
9761 }
9762 // Shamanistic Rage triggered spell
9763 case 30824:
9764 {
9765 basepoints0 = int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), triggerAmount));
9766 break;
9767 }
9768 // Enlightenment (trigger only from mana cost spells)
9769 case 35095:
9770 {
9771 if (!procSpell || procSpell->PowerType != POWER_MANA || (procSpell->ManaCost == 0 && procSpell->ManaCostPercentage == 0 && procSpell->ManaCostPerlevel == 0))
9772 return false;
9773 break;
9774 }
9775 case 46916: // Slam! (Bloodsurge proc)
9776 case 52437: // Sudden Death
9777 {
9778 // Item - Warrior T10 Melee 4P Bonus
9779 if (AuraEffect const* aurEff = GetAuraEffect(70847, 0))
9780 {
9781 if (!roll_chance_i(aurEff->GetAmount()))
9782 {
9783 // Xinef: dont allow normal proc to override set one
9784 if (GetAura((trigger_spell_id == 46916) ? 71072 : 71069))
9785 return false;
9786 // Xinef: just to be sure
9787 RemoveAurasDueToSpell(70849);
9788 break;
9789 }
9790
9791 // Xinef: fully remove all auras and reapply once more
9792 RemoveAurasDueToSpell(70849);
9793 RemoveAurasDueToSpell(71072);
9794 RemoveAurasDueToSpell(71069);
9795
9796 CastSpell(this, 70849, true, castItem, triggeredByAura); // Extra Charge!
9797 if (trigger_spell_id == 46916)
9798 CastSpell(this, 71072, true, castItem, triggeredByAura); // Slam GCD Reduced
9799 else
9800 CastSpell(this, 71069, true, castItem, triggeredByAura); // Execute GCD Reduced
9801 }
9802 break;
9803 }
9804 // Sword and Board
9805 case 50227:
9806 {
9807 // Remove cooldown on Shield Slam
9808 if (IsPlayer())
9810 break;
9811 }
9812 // Maelstrom Weapon
9813 case 53817:
9814 {
9815 // have rank dependent proc chance, ignore too often cases
9816 // PPM = 2.5 * (rank of talent),
9817 uint32 rank = auraSpellInfo->GetRank();
9818 // 5 rank -> 100% 4 rank -> 80% and etc from full rate
9819 if (!roll_chance_i(20 * rank))
9820 return false;
9821
9822 // Item - Shaman T10 Enhancement 4P Bonus
9823 if (AuraEffect const* aurEff = GetAuraEffect(70832, 0))
9824 if (Aura const* maelstrom = GetAura(53817))
9825 // xinef: we have 4 charges and all proc conditions are met - aura reaches 5 charges
9826 if ((maelstrom->GetStackAmount() == 4) && roll_chance_i(aurEff->GetAmount()))
9827 CastSpell(this, 70831, true, castItem, triggeredByAura);
9828
9829 break;
9830 }
9831 // Astral Shift
9832 case 52179:
9833 {
9834 if (!procSpell || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
9835 return false;
9836
9837 // Need stun, fear or silence mechanic
9838 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_SILENCE) | (1 << MECHANIC_STUN) | (1 << MECHANIC_FEAR))))
9839 return false;
9840 break;
9841 }
9842 // Glyph of Death's Embrace
9843 case 58679:
9844 {
9845 // Proc only from healing part of Death Coil. Check is essential as all Death Coil spells have 0x2000 mask in SpellFamilyFlags
9846 if (!procSpell || !(procSpell->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && procSpell->SpellFamilyFlags[0] == 0x80002000))
9847 return false;
9848 break;
9849 }
9850 // Glyph of Death Grip
9851 case 58628:
9852 {
9853 // remove cooldown of Death Grip
9854 if (IsPlayer())
9855 ToPlayer()->RemoveSpellCooldown(49576, true);
9856 return true;
9857 }
9858 // Savage Defense
9859 case 62606:
9860 {
9861 basepoints0 = CalculatePct(triggerAmount, GetTotalAttackPowerValue(BASE_ATTACK));
9862 break;
9863 }
9864 // Body and Soul
9865 case 64128:
9866 case 65081:
9867 {
9868 // Proc only from PW:S cast
9869 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x00000001))
9870 return false;
9871 break;
9872 }
9873 // Culling the Herd
9874 case 70893:
9875 {
9876 if (!procSpell)
9877 {
9878 return false;
9879 }
9880 // check if we're doing a critical hit
9881 if (!(procSpell->SpellFamilyFlags[1] & 0x10000000) && (procEx != PROC_EX_CRITICAL_HIT))
9882 return false;
9883 // check if we're procced by Claw, Bite or Smack (need to use the spell icon ID to detect it)
9884 if (!(procSpell->SpellIconID == 262 || procSpell->SpellIconID == 1680 || procSpell->SpellIconID == 473))
9885 return false;
9886 break;
9887 }
9888 // Fingers of Frost, synchronise with Frostbite
9889 case 44544:
9890 {
9891 if (procPhase == PROC_SPELL_PHASE_HIT)
9892 {
9893 // Find Frostbite
9895 {
9896 if (!victim)
9897 return false;
9898
9899 uint8 fofRank = sSpellMgr->GetSpellRank(triggeredByAura->GetId());
9900 uint8 fbRank = sSpellMgr->GetSpellRank(aurEff->GetId());
9901 uint8 chance = uint8(std::ceil(fofRank * fbRank * 16.6f));
9902
9903 if (roll_chance_i(chance))
9904 CastSpell(victim, aurEff->GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true);
9905 }
9906 }
9907 break;
9908 }
9909 }
9910
9911 // try detect target manually if not set
9912 if (!target)
9913 target = !(procFlags & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && triggerEntry->IsPositive() ? this : victim;
9914
9915 if (cooldown)
9916 {
9917 if (HasSpellCooldown(triggerEntry->Id))
9918 return false;
9919
9920 AddSpellCooldown(triggerEntry->Id, 0, cooldown);
9921 }
9922
9923 if (basepoints0)
9924 CastCustomSpell(target, triggerEntry->Id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
9925 else
9926 CastSpell(target, triggerEntry->Id, true, castItem, triggeredByAura);
9927
9928 return true;
9929}
@ PROC_SPELL_PHASE_HIT
Definition: SpellMgr.h:244
@ SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE
Definition: SpellAuraDefines.h:294
@ SPELL_AURA_ADD_TARGET_TRIGGER
Definition: SpellAuraDefines.h:172
@ FORM_DIREBEAR
Definition: UnitDefines.h:77
@ FORM_MOONKIN
Definition: UnitDefines.h:98
@ FORM_NONE
Definition: UnitDefines.h:69
@ FORM_CAT
Definition: UnitDefines.h:70
@ FORM_TREE
Definition: UnitDefines.h:71
@ FORM_BEAR
Definition: UnitDefines.h:74
@ SPELL_HACK_AND_SLASH
Definition: Unit.h:293
@ SPELL_SWORD_SPECIALIZATION
Definition: Unit.h:292
@ SPELL_EFFECT_ADD_EXTRA_ATTACKS
Definition: SharedDefines.h:808
@ SPELL_ATTR1_NO_THREAT
Definition: SharedDefines.h:440
@ MECHANIC_FEAR
Definition: SharedDefines.h:1341
@ MECHANIC_SILENCE
Definition: SharedDefines.h:1345
@ AURA_STATE_HEALTHLESS_35_PERCENT
Definition: SharedDefines.h:1316
void ModifyThreatByPercent(Unit *victim, int32 percent)
Definition: ThreatMgr.cpp:508
bool HasMechanicTemplateImmunity(uint32 mask) const
Definition: Creature.cpp:2216
bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const
Definition: Player.cpp:13504
void RemoveCategoryCooldown(uint32 cat)
Definition: Player.cpp:3556
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition: Player.cpp:1295
Spell const * GetProcSpell() const
Definition: Unit.h:449
Unit * GetActor()
Definition: Unit.h:440
bool HealthAbovePct(int32 pct) const
Definition: Unit.h:1043
Creature * GetCompanionPet() const
Definition: Unit.cpp:10761
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition: Unit.cpp:15529
uint32 GetLastExtraAttackSpell() const
Definition: Unit.h:951
uint32 GetCreateHealth() const
Definition: Unit.h:1037
Unit * GetComboTarget() const
Definition: Unit.h:957
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition: Unit.h:1042
uint8 GetRank() const
Definition: SpellInfo.cpp:2506
uint32 ManaCostPercentage
Definition: SpellInfo.h:367
bool HasEffect(SpellEffects effect) const
Definition: SpellInfo.cpp:876
uint32 ManaCost
Definition: SpellInfo.h:363

References Player::AddSpellCooldown(), AddSpellCooldown(), AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, CalculatePct(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_PALADIN, CLASS_PRIEST, CLASS_SHAMAN, CountPctFromMaxHealth(), EFFECT_0, SpellInfo::Effects, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_MOONKIN, FORM_NONE, FORM_TREE, ProcEventInfo::GetActor(), SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), GetAura(), GetAuraEffect(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), Aura::GetCaster(), Aura::GetCastItemGUID(), getClass(), GetComboTarget(), GetCompanionPet(), GetCreateHealth(), GetCreateMana(), AuraEffect::GetEffIndex(), Object::GetEntry(), GetFirstSchoolInMask(), Object::GetFloatValue(), Object::GetGUID(), AuraEffect::GetId(), Player::GetItemByGuid(), GetLastExtraAttackSpell(), SpellInfo::GetMaxDuration(), Player::GetPet(), ProcEventInfo::GetProcSpell(), SpellInfo::GetRank(), SpellInfo::GetSchoolMask(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Aura::GetStackAmount(), GetStat(), GetThreatMgr(), GetTotalAttackPowerValue(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), SpellInfo::HasEffect(), Creature::HasMechanicTemplateImmunity(), HasSpellCooldown(), HealthAbovePct(), HealthBelowPct(), HealthBelowPctDamaged(), SpellInfo::Id, IsAlive(), Player::IsBaseRuneSlotsOnCooldown(), Player::IsClass(), IsClass(), Object::IsPlayer(), SpellInfo::IsPositive(), LOG_ERROR, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, SpellInfo::ManaCostPerlevel, MAX_RUNES, MECHANIC_FEAR, MECHANIC_SILENCE, MECHANIC_STUN, ThreatMgr::ModifyThreatByPercent(), POWER_MANA, SpellInfo::PowerType, PROC_EX_CRITICAL_HIT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, PROC_SPELL_PHASE_HIT, RemoveAurasDueToSpell(), Player::RemoveCategoryCooldown(), Player::RemoveSpellCooldown(), roll_chance_i(), RUNE_BLOOD, SPELL_ATTR1_NO_THREAT, SPELL_AURA_ADD_TARGET_TRIGGER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_EFFECT_ADD_EXTRA_ATTACKS, SPELL_HACK_AND_SLASH, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, SPELL_SWORD_SPECIALIZATION, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sSpellMgr, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STRENGTH, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MINDAMAGE, and UNIT_FIELD_MINOFFHANDDAMAGE.

Referenced by ProcDamageAndSpellFor().

◆ HandleSafeUnitPointersOnDelete()

void Unit::HandleSafeUnitPointersOnDelete ( Unit thisUnit)
static
4395{
4396 if (thisUnit->SafeUnitPointerSet.empty())
4397 return;
4398 for (std::set<SafeUnitPointer*>::iterator itr = thisUnit->SafeUnitPointerSet.begin(); itr != thisUnit->SafeUnitPointerSet.end(); ++itr)
4399 (*itr)->UnitDeleted();
4400
4401 thisUnit->SafeUnitPointerSet.clear();
4402}

References SafeUnitPointerSet.

Referenced by ~Unit().

◆ HandleSpellClick()

bool Unit::HandleSpellClick ( Unit clicker,
int8  seatId = -1 
)

First check simple relations from clicker to clickee

Check database conditions

19385{
19386 Creature* creature = ToCreature();
19387 if (creature && creature->IsAIEnabled)
19388 {
19389 if (!creature->AI()->BeforeSpellClick(clicker))
19390 {
19391 return false;
19392 }
19393 }
19394
19395 bool result = false;
19396 uint32 spellClickEntry = GetVehicleKit() ? GetVehicleKit()->GetCreatureEntry() : GetEntry();
19397 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(spellClickEntry);
19398 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
19399 {
19401 if (!itr->second.IsFitToRequirements(clicker, this))
19402 continue;
19403
19405 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(spellClickEntry, itr->second.spellId);
19406 ConditionSourceInfo info = ConditionSourceInfo(clicker, this);
19407 if (!sConditionMgr->IsObjectMeetToConditions(info, conds))
19408 continue;
19409
19410 Unit* caster = (itr->second.castFlags & NPC_CLICK_CAST_CASTER_CLICKER) ? clicker : this;
19411 Unit* target = (itr->second.castFlags & NPC_CLICK_CAST_TARGET_CLICKER) ? clicker : this;
19412 ObjectGuid origCasterGUID = (itr->second.castFlags & NPC_CLICK_CAST_ORIG_CASTER_OWNER) ? GetOwnerGUID() : clicker->GetGUID();
19413
19414 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->second.spellId);
19415
19416 // xinef: dont allow players to enter vehicles on arena
19417 if (spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) && caster->IsPlayer() && caster->FindMap() && caster->FindMap()->IsBattleArena())
19418 continue;
19419
19420 if (seatId > -1)
19421 {
19422 uint8 i = 0;
19423 bool valid = false;
19424 while (i < MAX_SPELL_EFFECTS)
19425 {
19426 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_CONTROL_VEHICLE)
19427 {
19428 valid = true;
19429 break;
19430 }
19431 ++i;
19432 }
19433
19434 if (!valid)
19435 {
19436 LOG_ERROR("sql.sql", "Spell {} specified in npc_spellclick_spells is not a valid vehicle enter aura!", itr->second.spellId);
19437 continue;
19438 }
19439
19440 if (IsInMap(caster))
19441 caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0 + i), seatId + 1, target, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19442 else // This can happen during Player::_LoadAuras
19443 {
19445 for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
19446 bp0[j] = spellInfo->Effects[j].BasePoints;
19447
19448 bp0[i] = seatId;
19449 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, bp0, nullptr, origCasterGUID);
19450 }
19451 }
19452 else
19453 {
19454 if (IsInMap(caster))
19455 caster->CastSpell(target, spellInfo, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19456 else
19457 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, nullptr, nullptr, origCasterGUID);
19458 }
19459
19460 result = true;
19461 }
19462
19463 if (creature && creature->IsAIEnabled)
19464 creature->AI()->OnSpellClick(clicker, result);
19465
19466 return result;
19467}
SpellValueMod
Definition: SpellDefines.h:112
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition: ObjectMgr.h:408
#define sConditionMgr
Definition: ConditionMgr.h:291
std::list< Condition * > ConditionList
Definition: ConditionMgr.h:238
@ NPC_CLICK_CAST_TARGET_CLICKER
Definition: SharedDefines.h:702
@ NPC_CLICK_CAST_ORIG_CASTER_OWNER
Definition: SharedDefines.h:703
@ NPC_CLICK_CAST_CASTER_CLICKER
Definition: SharedDefines.h:701
virtual void OnSpellClick(Unit *, bool &)
Definition: CreatureAI.h:207
virtual bool BeforeSpellClick(Unit *)
Definition: CreatureAI.h:205
Definition: ConditionMgr.h:183
Map * FindMap() const
Definition: Object.h:622
uint32 GetCreatureEntry() const
Definition: Vehicle.h:39
bool IsBattleArena() const
Definition: Map.h:302
bool HasAura(AuraType aura) const
Definition: SpellInfo.cpp:893

References Creature::AI(), CreatureAI::BeforeSpellClick(), CastCustomSpell(), CastSpell(), SpellInfo::Effects, WorldObject::FindMap(), Vehicle::GetCreatureEntry(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), GetVehicleKit(), SpellInfo::HasAura(), IsAIEnabled, Map::IsBattleArena(), WorldObject::IsInMap(), Object::IsPlayer(), LOG_ERROR, MAX_EFFECT_MASK, MAX_SPELL_EFFECTS, NPC_CLICK_CAST_CASTER_CLICKER, NPC_CLICK_CAST_ORIG_CASTER_OWNER, NPC_CLICK_CAST_TARGET_CLICKER, CreatureAI::OnSpellClick(), sConditionMgr, sObjectMgr, SPELL_AURA_CONTROL_VEHICLE, SPELLVALUE_BASE_POINT0, sSpellMgr, Object::ToCreature(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, TRIGGERED_NONE, and Aura::TryRefreshStackOrCreate().

Referenced by boss_xt002::boss_xt002AI::AttachHeart(), boss_kologarn::boss_kologarnAI::AttachLeftArm(), boss_kologarn::boss_kologarnAI::AttachRightArm(), WorldSession::HandleSpellClick(), Vehicle::InstallAccessory(), and npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI().

◆ HandleStatModifier()

bool Unit::HandleStatModifier ( UnitMods  unitMod,
UnitModifierType  modifierType,
float  amount,
bool  apply 
)
15305{
15306 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15307 {
15308 LOG_ERROR("entities.unit", "ERROR in HandleStatModifier(): non-existing UnitMods or wrong UnitModifierType!");
15309 return false;
15310 }
15311
15312 switch (modifierType)
15313 {
15314 case BASE_VALUE:
15315 case TOTAL_VALUE:
15316 m_auraModifiersGroup[unitMod][modifierType] += apply ? amount : -amount;
15317 break;
15318 case BASE_PCT:
15319 case TOTAL_PCT:
15320 ApplyPercentModFloatVar(m_auraModifiersGroup[unitMod][modifierType], amount, apply);
15321 break;
15322 default:
15323 break;
15324 }
15325
15326 if (!CanModifyStats())
15327 return false;
15328
15329 switch (unitMod)
15330 {
15337 break;
15338
15339 case UNIT_MOD_ARMOR:
15340 UpdateArmor();
15341 break;
15342 case UNIT_MOD_HEALTH:
15344 break;
15345
15346 case UNIT_MOD_MANA:
15347 case UNIT_MOD_RAGE:
15348 case UNIT_MOD_FOCUS:
15349 case UNIT_MOD_ENERGY:
15350 case UNIT_MOD_HAPPINESS:
15351 case UNIT_MOD_RUNE:
15354 break;
15355
15363 break;
15364
15367 break;
15370 break;
15371
15374 break;
15377 break;
15380 break;
15381
15382 default:
15383 break;
15384 }
15385
15386 return true;
15387}
@ UNIT_MOD_ARMOR
Definition: Unit.h:157
@ UNIT_MOD_ATTACK_POWER
Definition: Unit.h:164
@ UNIT_MOD_HEALTH
Definition: Unit.h:149
@ UNIT_MOD_DAMAGE_RANGED
Definition: Unit.h:168
@ UNIT_MOD_DAMAGE_MAINHAND
Definition: Unit.h:166
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition: Unit.h:165
void apply(T *val)
Definition: ByteConverter.h:40
SpellSchools GetSpellSchoolByAuraGroup(UnitMods unitMod) const
Definition: Unit.cpp:15446
Stats GetStatByAuraGroup(UnitMods unitMod) const
Definition: Unit.cpp:15478
virtual void UpdateAttackPowerAndDamage(bool ranged=false)=0
virtual void UpdateResistances(uint32 school)=0
Powers GetPowerTypeByAuraGroup(UnitMods unitMod) const
Definition: Unit.cpp:15507
virtual void UpdateDamagePhysical(WeaponAttackType attType)
Definition: StatSystem.cpp:60
virtual void UpdateArmor()=0
virtual void UpdateMaxPower(Powers power)=0
virtual bool UpdateStats(Stats stat)=0
bool CanModifyStats() const
Definition: Unit.h:1022
virtual void UpdateMaxHealth()=0

References ApplyPercentModFloatVar(), BASE_ATTACK, BASE_PCT, BASE_VALUE, CanModifyStats(), GetPowerTypeByAuraGroup(), GetSpellSchoolByAuraGroup(), GetStatByAuraGroup(), LOG_ERROR, m_auraModifiersGroup, MODIFIER_TYPE_END, OFF_ATTACK, RANGED_ATTACK, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_ARMOR, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, UNIT_MOD_END, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, UNIT_MOD_RESISTANCE_SHADOW, UNIT_MOD_RUNE, UNIT_MOD_RUNIC_POWER, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, UNIT_MOD_STAT_STRENGTH, UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDamagePhysical(), UpdateMaxHealth(), UpdateMaxPower(), UpdateResistances(), and UpdateStats().

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDependentAuraDamageMod(), boss_marli::_schedulePhaseSpider(), boss_marli::_schedulePhaseTroll(), Player::ApplyEnchantment(), AuraEffect::HandleAuraIncreaseBaseHealthPercent(), AuraEffect::HandleAuraModAttackPower(), AuraEffect::HandleAuraModAttackPowerPercent(), AuraEffect::HandleAuraModBaseResistancePCT(), AuraEffect::HandleAuraModIncreaseEnergy(), AuraEffect::HandleAuraModIncreaseEnergyPercent(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), AuraEffect::HandleAuraModRangedAttackPower(), AuraEffect::HandleAuraModRangedAttackPowerPercent(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModResistanceExclusive(), AuraEffect::HandleAuraModStat(), AuraEffect::HandleModBaseResistance(), AuraEffect::HandleModDamageDone(), AuraEffect::HandleModDamagePercentDone(), AuraEffect::HandleModOffhandDamagePercent(), AuraEffect::HandleModPercentStat(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), Guardian::InitStatsForLevel(), spell_astromancer_solarian_transform::OnApply(), spell_astromancer_solarian_transform::OnRemove(), boss_arlokk::boss_arlokkAI::Reset(), boss_marli::Reset(), and boss_arlokk::boss_arlokkAI::UpdateAI().

◆ HasActivePowerType()

◆ HasAllAuras()

template<typename... Auras>
bool Unit::HasAllAuras ( Auras...  spellIds) const
inline

Checks if the unit has ALL specified auras.

Template Parameters
AurasCan be any type convertible to uint32.
Parameters
spellIdsList of spell id's to check for on the unit.
Returns
Returns true if the unit has ALL of the specified auras. Otherwise false.
1413 {
1414 std::vector<uint32> spellList = { static_cast<uint32>(spellIds)... };
1415 return HasAuras(SearchMethod::MatchAll, spellList);
1416 }
bool HasAuras(SearchMethod sm, std::vector< uint32 > &spellIds) const
Check if unit has ANY or ALL specified auras.
Definition: Unit.cpp:5763

References HasAuras().

Referenced by achievement_staying_buffed_all_winter_10::OnCheck(), achievement_staying_buffed_all_winter_25::OnCheck(), npc_alchemist_adrianna::OnGossipHello(), and npc_nelson::npc_nelsonAI::SpellHit().

◆ HasAllowOnlyAbilityAura()

bool Unit::HasAllowOnlyAbilityAura ( ) const
inline
@ SPELL_AURA_ALLOW_ONLY_ABILITY
Definition: SpellAuraDefines.h:326
bool HasAuraType(AuraType auraType) const
Definition: Unit.cpp:5793

References HasAuraType(), and SPELL_AURA_ALLOW_ONLY_ABILITY.

Referenced by AuraEffect::HandleAuraAllowOnlyAbility().

◆ HasAnyAuras()

template<typename... Auras>
bool Unit::HasAnyAuras ( Auras...  spellIds) const
inline

Checks if the unit has ANY specified auras.

Template Parameters
AurasCan be any type convertible to uint32.
Parameters
spellIdsList of spell id's to check for on the unit.
Returns
Returns true if the unit has ANY of the specified auras. Otherwise false.
1398 {
1399 std::vector<uint32> spellList = { static_cast<uint32>(spellIds)... };
1400 return HasAuras(SearchMethod::MatchAny, spellList);
1401 }

References HasAuras().

Referenced by Player::GiveXP(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), npc_necrotic_shard::HasCampTypeAura(), IsVampire(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), achievement_flirt_with_disaster_perf_check::OnCheck(), go_manticron_cube::OnGossipHello(), NecroticPlagueTargetCheck::operator()(), LastPhaseIceTombTargetSelector::operator()(), DefileTargetSelector::operator()(), spell_item_brewfest_hops::Update(), and boss_eregos::boss_eregosAI::UpdateAI().

◆ HasAOECharmAura()

bool Unit::HasAOECharmAura ( ) const
inline
@ SPELL_AURA_AOE_CHARM
Definition: SpellAuraDefines.h:240

References HasAuraType(), and SPELL_AURA_AOE_CHARM.

◆ HasAttackerSpellCritChanceAura()

bool Unit::HasAttackerSpellCritChanceAura ( ) const
inline
@ SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
Definition: SpellAuraDefines.h:242

References HasAuraType(), and SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE.

Referenced by SpellTakenCritChance().

◆ HasAura()

bool Unit::HasAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5787{
5788 if (GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask))
5789 return true;
5790 return false;
5791}

References GetAuraApplication().

Referenced by boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), spell_warl_health_funnel::ApplyEffect(), Player::ApplyItemObtainSpells(), boss_archavon::boss_archavonAI::AttackStart(), boss_emalon::boss_emalonAI::AttackStart(), boss_koralon::boss_koralonAI::AttackStart(), boss_toravon::boss_toravonAI::AttackStart(), boss_leotheras_the_blind::AttackStart(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), boss_hodir::boss_hodirAI::CanAIAttack(), boss_hazzarah::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_chromaggus::boss_chromaggusAI::CanAIAttack(), npc_parasitic_shadowfiend::CanAIAttack(), npc_wg_siege_machine::npc_wg_siege_machineAI::CanControlVehicle(), Player::CanJoinToBattleground(), Player::CanResummonPet(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CastItemCombatSpell(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), Spell::CheckCast(), Spell::CheckCasterAuras(), Spell::CheckItems(), spell_pal_hand_of_sacrifice::CheckTarget(), SpellInfo::CheckTarget(), spell_hun_lock_and_load::CheckTrapProc(), npc_jenny::DamageTaken(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_thekal::DamageTaken(), boss_tenris_mirkblood::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), boss_kalecgos::DoAction(), boss_illidan_stormrage::DoAction(), npc_midsummer_ribbon_pole_target::DoCleanupChecks(), Spell::DoCreateItem(), Spell::EffectDummy(), Spell::EffectHeal(), Spell::EffectInstaKill(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonPlayer(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), NPCStaveQuestAI::EvadeOnFeignDeath(), IceTombSummonEvent::Execute(), PartyTimeEmoteEvent::Execute(), spell_class_call_polymorph::FilterTargets(), spell_dru_wild_growth::FilterTargets(), spell_pri_circle_of_healing::FilterTargets(), Spell::finish(), lfg::LFGMgr::FinishDungeon(), GetDispellableAuraList(), Player::GetResurrectionSpellId(), go_wind_stone::go_wind_stoneAI::GossipHello(), go_soulwell::go_soulwellAI::GossipHello(), spell_braziers_hit::HandleAfterEffectApply(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraMounted(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), spell_thaddius_pos_neg_charge::HandleDamage(), spell_capacitus_polarity_charge::HandleDamage(), spell_mage_summon_water_elemental::HandleDummy(), spell_rog_preparation::HandleDummy(), spell_warr_charge::HandleDummy(), HandleDummyAuraProc(), spell_q12851_going_bearback::HandleEffectApply(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), Player::HandleFall(), gm_commandscript::HandleGMVisibleCommand(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), BattlefieldWG::HandleKill(), lookup_commandscript::HandleLookupSpellCommand(), lookup_commandscript::HandleLookupSpellIdCommand(), WorldSession::HandleMessagechatOpcode(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_mark_of_frost_freeze::HandleOnHit(), OPvPCapturePointZM_Graveyard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), spell_warr_vigilance::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_pal_lay_on_hands::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_q12641_death_comes_from_on_high_recall_eye::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_dru_glyph_of_starfire::HandleScriptEffect(), misc_commandscript::HandleUnFreezeCommand(), HasAuras(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InformCloud(), boss_taldaram::InitializeAI(), Player::IsDeserter(), SpellArea::IsFitToRequirements(), boss_krik_thir::boss_krik_thirAI::IsInFrenzy(), npc_anzu_spirit::IsSummonedBy(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), lfg::LFGMgr::JoinLfg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), boss_sindragosa::boss_sindragosaAI::JustDied(), boss_hydross_the_unstable::JustDied(), boss_alar::JustDied(), npc_sunblade_scout::JustEngagedWith(), boss_zuljin::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), boss_bjarngrim::boss_bjarngrimAI::JustEngagedWith(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::JustEngagedWith(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::JustEngagedWith(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), npc_hivezara_stinger::JustEngagedWith(), boss_vem::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_faerlina::boss_faerlinaAI::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_hydross_the_unstable::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), boss_hydross_the_unstable::JustReachedHome(), Kill(), boss_hydross_the_unstable::KilledUnit(), boss_hadronox::boss_hadronoxAI::KilledUnit(), Creature::LoadCreaturesAddon(), MeleeDamageBonusDone(), ModSpellCastTime(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_custodian_of_time::npc_custodian_of_timeAI::MoveInLineOfSight(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_daranelle::npc_daranelleAI::MoveInLineOfSight(), boss_lady_vashj::MovementInform(), boss_felmyst::MovementInform(), boss_kagani_nightstrike::MovementInform(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_aged_dying_ancient_kodo::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_innkeeper::OnGossipHello(), go_orb_of_domination::OnGossipHello(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerEnter(), MidsummerPlayerScript::OnPlayerUpdateZone(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), at_karazhan_atiesh_aran::OnTrigger(), at_hor_battered_hilt_start::OnTrigger(), at_hor_battered_hilt_throw::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), at_commander_dawnforge::OnTrigger(), Acore::FriendlyMissingBuffInRange::operator()(), NotInStomachSelector::operator()(), SindragosaIceTombCheck::operator()(), DefaultTargetSelector::operator()(), VampiricBiteTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::operator()(), ShadowOfDeathSelector::operator()(), Acore::UnitAuraCheck::operator()(), SpectralBlastCheck::operator()(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Player::ReportedAfkBy(), npc_corrupted_totem::Reset(), boss_janalai::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), boss_magus_telestra::Reset(), boss_illidan_stormrage::Reset(), boss_fathomlord_karathress::Reset(), Player::RewardHonor(), RewardRage(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_jormungarAI::ScheduleEvents(), boss_supremus::SchedulePhase(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), boss_anomalus::SetData(), npc_thassarian2::npc_thassarian2AI::sGossipHello(), npc_chesspiece::sGossipHello(), npc_omen::npc_omenAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_necropolis::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::SpellHit(), npc_necrotic_shard::SpellHit(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::SpellHit(), SpellPctDamageModsDone(), SpellTakenCritChance(), boss_moam::SummonedCreatureDies(), boss_apothecary_hummel::boss_apothecary_hummelAI::SummonedCreatureDies(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), npc_cyclone::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_moam::UpdateAI(), boss_ossirian::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_beryl_sorcerer::npc_beryl_sorcererAI::UpdateAI(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), npc_dark_fiend::UpdateAI(), Player::UpdateAreaDependentAuras(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), boss_netherspite::UpdatePortals(), Player::UpdateZoneDependentAuras(), and Spell::WriteAmmoToPacket().

◆ HasAuraEffect()

bool Unit::HasAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  caster = ObjectGuid::Empty 
) const
5734{
5735 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5736 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5737 {
5738 if (itr->second->HasEffect(effIndex)
5739 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5740 {
5741 return true;
5742 }
5743 }
5744 return false;
5745}

References m_appliedAuras.

Referenced by Spell::CanAutoCast(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), spell_q12683_take_sputum_sample::HandleDummy(), AchievementCriteriaData::Meets(), and boss_headless_horseman::UpdateAI().

◆ HasAuras()

bool Unit::HasAuras ( SearchMethod  sm,
std::vector< uint32 > &  spellIds 
) const

Check if unit has ANY or ALL specified auras.

Parameters
smThe search method to use
  • SearchMethod::MatchAll : The function checks for all of the spell id's on the unit.
  • SearchMethod::MatchAny : The function checks for any of the spell id's on the unit.
spellIdsList of spell id's to check for on the unit.
Returns
Returns true if the search method condition is met. Otherwise false.
5764{
5765 if (sm == SearchMethod::MatchAll)
5766 {
5767 for (auto const& spellId : spellIds)
5768 if (!HasAura(spellId))
5769 return false;
5770 return true;
5771 }
5772 else if (sm == SearchMethod::MatchAny)
5773 {
5774 for (auto const& spellId : spellIds)
5775 if (HasAura(spellId))
5776 return true;
5777 return false;
5778 }
5779 else
5780 {
5781 LOG_ERROR("entities.unit", "Unit::HasAuras using non-supported SearchMethod {}", sm);
5782 return false;
5783 }
5784}

References HasAura(), and LOG_ERROR.

Referenced by HasAllAuras(), and HasAnyAuras().

◆ HasAuraState()

bool Unit::HasAuraState ( AuraStateType  flag,
SpellInfo const *  spellProto = nullptr,
Unit const *  Caster = nullptr 
) const
10643{
10644 if (Caster)
10645 {
10646 if (spellProto)
10647 {
10648 AuraEffectList const& stateAuras = Caster->GetAuraEffectsByType(SPELL_AURA_ABILITY_IGNORE_AURASTATE);
10649 for (AuraEffectList::const_iterator j = stateAuras.begin(); j != stateAuras.end(); ++j)
10650 if ((*j)->IsAffectedOnSpell(spellProto))
10651 return true;
10652 }
10653 // Check per caster aura state
10654 // If aura with aurastate by caster not found return false
10655 if ((1 << (flag - 1)) & PER_CASTER_AURA_STATE_MASK)
10656 {
10657 AuraStateAurasMapBounds range = m_auraStateAuras.equal_range(flag);
10658 for (AuraStateAurasMap::const_iterator itr = range.first; itr != range.second; ++itr)
10659 if (itr->second->GetBase()->GetCasterGUID() == Caster->GetGUID())
10660 return true;
10661 return false;
10662 }
10663 }
10664
10665 return HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10666}
@ SPELL_AURA_ABILITY_IGNORE_AURASTATE
Definition: SpellAuraDefines.h:325
std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
Definition: Unit.h:634

References GetAuraEffectsByType(), Object::GetGUID(), Object::HasFlag(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, SPELL_AURA_ABILITY_IGNORE_AURASTATE, and UNIT_FIELD_AURASTATE.

Referenced by Player::_addSpell(), Pet::addSpell(), Spell::CheckCast(), spell_sha_earthliving_weapon::CheckProc(), SpellInfo::CheckTarget(), ClearAllReactives(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), isFrozen(), Player::LoadFromDB(), MeleeDamageBonusDone(), SpellPctDamageModsDone(), SpellTakenCritChance(), and UpdateReactives().

◆ HasAuraType()

bool Unit::HasAuraType ( AuraType  auraType) const
5794{
5795 return (!m_modAuras[auraType].empty());
5796}

References m_modAuras.

Referenced by Player::CanTameExoticPets(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraEmpathy(), AuraEffect::HandleAuraFeatherFall(), AuraEffect::HandleAuraHover(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModStalked(), AuraEffect::HandleAuraTrackStealthed(), AuraEffect::HandleAuraUntrackable(), AuraEffect::HandleAuraWaterWalk(), AuraEffect::HandleComprehendLanguage(), AuraEffect::HandleForceMoveForward(), HasAllowOnlyAbilityAura(), HasAOECharmAura(), HasAttackerSpellCritChanceAura(), HasAuraTypeWithFamilyFlags(), HasCloneCasterAura(), HasConfuseAura(), HasControlVehicleAura(), HasDecreaseSpeedAura(), HasDetectAmoreAura(), HasDetectSpellsAura(), HasFearAura(), HasFeatherFallAura(), HasFlyAura(), HasGhostAura(), HasHealthRegenInCombatAura(), HasHoverAura(), HasIgnoreHitDirectionAura(), HasIgnoreTargetResistAura(), HasIncreaseMountedFlightSpeedAura(), HasIncreaseMountedSpeedAura(), HasInterruptRegenAura(), HasInvisibilityAura(), HasInvisibilityDetectAura(), HasMountedAura(), HasNoPVPCreditAura(), HasOpenStableAura(), HasPacifyAura(), HasPacifySilenceAura(), HasPeriodicDummyAura(), HasPreventDurabilityLossAura(), HasPreventResurectionAura(), HasPreventsFleeingAura(), HasReflectSpellsAura(), HasRegenDuringCombatAura(), HasRootAura(), HasShapeshiftAura(), HasSilenceAura(), HasSpellMagnetAura(), HasSpiritOfRedemptionAura(), HasStealthAura(), HasStealthDetectAura(), HasStunAura(), HasTauntAura(), HasThreatAura(), HasTransformAura(), HasUnattackableAura(), HasWaterBreathingAura(), and HasWaterWalkAura().

◆ HasAuraTypeWithAffectMask()

bool Unit::HasAuraTypeWithAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
5827{
5828 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5829 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5830 if ((*i)->IsAffectedOnSpell(affectedSpell))
5831 return true;
5832 return false;
5833}

References GetAuraEffectsByType().

Referenced by AuraEffect::CalculatePeriodic(), Spell::DoSpellHitOnUnit(), Spell::handle_immediate(), Aura::RefreshDuration(), and Aura::RefreshTimersWithMods().

◆ HasAuraTypeWithCaster()

bool Unit::HasAuraTypeWithCaster ( AuraType  auratype,
ObjectGuid  caster 
) const
5799{
5800 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5801 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5802 if (caster == (*i)->GetCasterGUID())
5803 return true;
5804 return false;
5805}

References GetAuraEffectsByType().

Referenced by BuildValuesUpdate(), IsAlwaysDetectableFor(), PatchValuesUpdate(), and ThreatContainer::SelectNextVictim().

◆ HasAuraTypeWithFamilyFlags()

bool Unit::HasAuraTypeWithFamilyFlags ( AuraType  auraType,
uint32  familyName,
uint32  familyFlags 
) const
781{
782 if (!HasAuraType(auraType))
783 return false;
784 AuraEffectList const& auras = GetAuraEffectsByType(auraType);
785 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
786 if (SpellInfo const* iterSpellProto = (*itr)->GetSpellInfo())
787 if (iterSpellProto->SpellFamilyName == familyName && iterSpellProto->SpellFamilyFlags[0] & familyFlags)
788 return true;
789 return false;
790}

References GetAuraEffectsByType(), and HasAuraType().

◆ HasAuraTypeWithMiscvalue()

bool Unit::HasAuraTypeWithMiscvalue ( AuraType  auratype,
int32  miscvalue 
) const
5818{
5819 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5820 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5821 if (miscvalue == (*i)->GetMiscValue())
5822 return true;
5823 return false;
5824}

References GetAuraEffectsByType().

Referenced by Player::Regenerate(), Player::UpdateManaRegen(), and Player::UpdateStats().

◆ HasAuraTypeWithTriggerSpell()

bool Unit::HasAuraTypeWithTriggerSpell ( AuraType  auratype,
uint32  triggerSpell 
) const
5845{
5846 for (AuraEffect const* aura : GetAuraEffectsByType(auratype))
5847 {
5848 if (aura->GetSpellInfo()->Effects[aura->GetEffIndex()].TriggerSpell == triggerSpell)
5849 {
5850 return true;
5851 }
5852 }
5853
5854 return false;
5855}

References GetAuraEffectsByType().

Referenced by WorldSession::HandlePetActionHelper().

◆ HasAuraTypeWithValue()

bool Unit::HasAuraTypeWithValue ( AuraType  auratype,
int32  value 
) const
5836{
5837 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5838 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5839 if (value == (*i)->GetAmount())
5840 return true;
5841 return false;
5842}

References GetAuraEffectsByType().

◆ HasAuraWithMechanic()

bool Unit::HasAuraWithMechanic ( uint32  mechanicMask) const
5881{
5882 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5883 {
5884 SpellInfo const* spellInfo = iter->second->GetBase()->GetSpellInfo();
5885 if (spellInfo->Mechanic && (mechanicMask & (1 << spellInfo->Mechanic)))
5886 return true;
5887
5888 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5889 if (iter->second->HasEffect(i) && spellInfo->Effects[i].Effect && spellInfo->Effects[i].Mechanic)
5890 if (mechanicMask & (1 << spellInfo->Effects[i].Mechanic))
5891 return true;
5892 }
5893
5894 return false;
5895}

References SpellInfo::Effects, m_appliedAuras, MAX_SPELL_EFFECTS, and SpellInfo::Mechanic.

Referenced by EarthenPowerTargetSelector::operator()(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ HasBreakableByDamageAuraType()

bool Unit::HasBreakableByDamageAuraType ( AuraType  type,
uint32  excludeAura = 0 
) const
793{
794 AuraEffectList const& auras = GetAuraEffectsByType(type);
795 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
796 if ((!excludeAura || excludeAura != (*itr)->GetSpellInfo()->Id) && //Avoid self interrupt of channeled Crowd Control spells like Seduction
797 ((*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE))
798 return true;
799 return false;
800}

References AURA_INTERRUPT_FLAG_TAKE_DAMAGE, and GetAuraEffectsByType().

Referenced by HasBreakableByDamageCrowdControlAura().

◆ HasBreakableByDamageCrowdControlAura()

bool Unit::HasBreakableByDamageCrowdControlAura ( Unit excludeCasterChannel = nullptr) const
803{
804 uint32 excludeAura = 0;
805 if (Spell* currentChanneledSpell = excludeCasterChannel ? excludeCasterChannel->GetCurrentSpell(CURRENT_CHANNELED_SPELL) : nullptr)
806 excludeAura = currentChanneledSpell->GetSpellInfo()->Id; //Avoid self interrupt of channeled Crowd Control spells like Seduction
807
813}
@ SPELL_AURA_MOD_FEAR
Definition: SpellAuraDefines.h:70
@ SPELL_AURA_MOD_ROOT
Definition: SpellAuraDefines.h:89
@ SPELL_AURA_TRANSFORM
Definition: SpellAuraDefines.h:119
@ SPELL_AURA_MOD_CONFUSE
Definition: SpellAuraDefines.h:68
@ SPELL_AURA_MOD_STUN
Definition: SpellAuraDefines.h:75
bool HasBreakableByDamageAuraType(AuraType type, uint32 excludeAura=0) const
Definition: Unit.cpp:792
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition: Unit.h:1497

References CURRENT_CHANNELED_SPELL, GetCurrentSpell(), HasBreakableByDamageAuraType(), SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, and SPELL_AURA_TRANSFORM.

Referenced by PetAI::CanAttack(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), CasterAI::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), and PetAI::UpdateAI().

◆ HasCloneCasterAura()

bool Unit::HasCloneCasterAura ( ) const
inline
@ SPELL_AURA_CLONE_CASTER
Definition: SpellAuraDefines.h:310

References HasAuraType(), and SPELL_AURA_CLONE_CASTER.

Referenced by WorldSession::HandleMirrorImageDataRequest().

◆ HasConfuseAura()

bool Unit::HasConfuseAura ( ) const
inline

◆ HasControlVehicleAura()

bool Unit::HasControlVehicleAura ( ) const
inline

◆ HasDecreaseSpeedAura()

bool Unit::HasDecreaseSpeedAura ( ) const
inline

◆ HasDetectAmoreAura()

bool Unit::HasDetectAmoreAura ( ) const
inline
@ SPELL_AURA_DETECT_AMORE
Definition: SpellAuraDefines.h:233

References HasAuraType(), and SPELL_AURA_DETECT_AMORE.

Referenced by AuraEffect::HandleDetectAmore().

◆ HasDetectSpellsAura()

bool Unit::HasDetectSpellsAura ( ) const
inline
@ SPELL_AURA_DEFLECT_SPELLS
Definition: SpellAuraDefines.h:350

References HasAuraType(), and SPELL_AURA_DEFLECT_SPELLS.

◆ HasExtraUnitMovementFlag()

uint16 Unit::HasExtraUnitMovementFlag ( uint16  f) const
inline

◆ HasFearAura()

◆ HasFeatherFallAura()

bool Unit::HasFeatherFallAura ( ) const
inline
@ SPELL_AURA_FEATHER_FALL
Definition: SpellAuraDefines.h:168

References HasAuraType(), and SPELL_AURA_FEATHER_FALL.

Referenced by Player::GetAurasForTarget(), and Player::HandleFall().

◆ HasFlyAura()

◆ HasGhostAura()

bool Unit::HasGhostAura ( ) const
inline
1715{ return HasAuraType(SPELL_AURA_GHOST); };
@ SPELL_AURA_GHOST
Definition: SpellAuraDefines.h:158

References HasAuraType(), and SPELL_AURA_GHOST.

Referenced by SpellInfo::CheckTarget(), AuraEffect::HandleAuraGhost(), and Acore::AnyDeadUnitObjectInRangeCheck::operator()().

◆ HasHealthRegenInCombatAura()

bool Unit::HasHealthRegenInCombatAura ( ) const
inline
@ SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
Definition: SpellAuraDefines.h:224

References HasAuraType(), and SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT.

Referenced by Player::RegenerateAll().

◆ HasHoverAura()

bool Unit::HasHoverAura ( ) const
inline
1719{ return HasAuraType(SPELL_AURA_HOVER); };
@ SPELL_AURA_HOVER
Definition: SpellAuraDefines.h:169

References HasAuraType(), and SPELL_AURA_HOVER.

Referenced by Player::GetAurasForTarget(), Player::HandleFall(), and Creature::UpdateMovementFlags().

◆ HasIgnoreHitDirectionAura()

bool Unit::HasIgnoreHitDirectionAura ( ) const
inline
@ SPELL_AURA_IGNORE_HIT_DIRECTION
Definition: SpellAuraDefines.h:351

References HasAuraType(), and SPELL_AURA_IGNORE_HIT_DIRECTION.

Referenced by isSpellBlocked(), MagicSpellHitResult(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ HasIgnoreTargetResistAura()

bool Unit::HasIgnoreTargetResistAura ( ) const
inline

◆ HasIncreaseMountedFlightSpeedAura()

◆ HasIncreaseMountedSpeedAura()

bool Unit::HasIncreaseMountedSpeedAura ( ) const
inline
@ SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED
Definition: SpellAuraDefines.h:95

References HasAuraType(), and SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED.

◆ HasInterruptRegenAura()

bool Unit::HasInterruptRegenAura ( ) const
inline
@ SPELL_AURA_INTERRUPT_REGEN
Definition: SpellAuraDefines.h:157

References HasAuraType(), and SPELL_AURA_INTERRUPT_REGEN.

Referenced by Player::Regenerate().

◆ HasInvisibilityAura()

bool Unit::HasInvisibilityAura ( ) const
inline

◆ HasInvisibilityDetectAura()

bool Unit::HasInvisibilityDetectAura ( ) const
inline
@ SPELL_AURA_MOD_INVISIBILITY_DETECT
Definition: SpellAuraDefines.h:82

References HasAuraType(), and SPELL_AURA_MOD_INVISIBILITY_DETECT.

Referenced by AuraEffect::HandleModInvisibilityDetect().

◆ HasLeewayMovement()

bool Unit::HasLeewayMovement ( ) const
inline
1646 {
1648 && !IsWalking();
1649 }
@ MOVEMENTFLAG_STRAFE_LEFT
Definition: UnitDefines.h:369
@ MOVEMENTFLAG_STRAFE_RIGHT
Definition: UnitDefines.h:370
bool HasMovementFlag(uint32 flag) const
Definition: Object.h:346
bool IsWalking() const
Definition: Unit.h:1624

References MovementInfo::HasMovementFlag(), IsWalking(), WorldObject::m_movementInfo, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FORWARD, MOVEMENTFLAG_STRAFE_LEFT, and MOVEMENTFLAG_STRAFE_RIGHT.

Referenced by Spell::CheckRange(), and IsWithinMeleeRange().

◆ HasMainhandWeapon()

bool Unit::HasMainhandWeapon ( ) const
inline
924{ return HasWeapon(BASE_ATTACK); }
virtual bool HasWeapon(WeaponAttackType type) const =0

References BASE_ATTACK, and HasWeapon().

◆ hasMainhandWeaponForAttack()

bool Unit::hasMainhandWeaponForAttack ( ) const
inline
virtual bool HasWeaponForAttack(WeaponAttackType type) const
Definition: Unit.h:929

References BASE_ATTACK, and HasWeaponForAttack().

◆ HasMainhandWeaponForAttack()

bool Unit::HasMainhandWeaponForAttack ( ) const
inline

◆ HasMountedAura()

◆ HasNegativeAuraWithAttribute()

bool Unit::HasNegativeAuraWithAttribute ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5870{
5871 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5872 {
5873 Aura const* aura = iter->second->GetBase();
5874 if (!iter->second->IsPositive() && aura->GetSpellInfo()->Attributes & flag && (!guid || aura->GetCasterGUID() == guid))
5875 return true;
5876 }
5877 return false;
5878}
uint32 Attributes
Definition: SpellInfo.h:324

References SpellInfo::Attributes, Aura::GetCasterGUID(), Aura::GetSpellInfo(), and m_appliedAuras.

◆ HasNegativeAuraWithInterruptFlag()

bool Unit::HasNegativeAuraWithInterruptFlag ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5858{
5859 if (!(m_interruptMask & flag))
5860 return false;
5861 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end(); ++iter)
5862 {
5863 if (!(*iter)->IsPositive() && (*iter)->GetBase()->GetSpellInfo()->AuraInterruptFlags & flag && (!guid || (*iter)->GetBase()->GetCasterGUID() == guid))
5864 return true;
5865 }
5866 return false;
5867}

References m_interruptableAuras, and m_interruptMask.

Referenced by ThreatContainer::SelectNextVictim().

◆ HasNoPVPCreditAura()

bool Unit::HasNoPVPCreditAura ( ) const
inline
@ SPELL_AURA_NO_PVP_CREDIT
Definition: SpellAuraDefines.h:222

References HasAuraType(), and SPELL_AURA_NO_PVP_CREDIT.

Referenced by Player::RewardHonor().

◆ HasNpcFlag()

bool Unit::HasNpcFlag ( NPCFlags  flags) const
inline

◆ HasOffhandWeapon()

bool Unit::HasOffhandWeapon ( ) const
inline
925{ return HasWeapon(OFF_ATTACK); }

References HasWeapon(), and OFF_ATTACK.

◆ HasOffhandWeaponForAttack()

◆ HasOpenStableAura()

bool Unit::HasOpenStableAura ( ) const
inline
@ SPELL_AURA_OPEN_STABLE
Definition: SpellAuraDefines.h:355

References HasAuraType(), and SPELL_AURA_OPEN_STABLE.

◆ HasPacifyAura()

bool Unit::HasPacifyAura ( ) const
inline
@ SPELL_AURA_MOD_PACIFY
Definition: SpellAuraDefines.h:88

References HasAuraType(), and SPELL_AURA_MOD_PACIFY.

Referenced by AuraEffect::HandleAuraModPacify(), and WorldSession::HandlePetActionHelper().

◆ HasPacifySilenceAura()

bool Unit::HasPacifySilenceAura ( ) const
inline

◆ HasPeriodicDummyAura()

bool Unit::HasPeriodicDummyAura ( ) const
inline

◆ HasPreventDurabilityLossAura()

bool Unit::HasPreventDurabilityLossAura ( ) const
inline
@ SPELL_AURA_PREVENT_DURABILITY_LOSS
Definition: SpellAuraDefines.h:352

References HasAuraType(), and SPELL_AURA_PREVENT_DURABILITY_LOSS.

Referenced by Player::DurabilityPointsLoss().

◆ HasPreventResurectionAura()

bool Unit::HasPreventResurectionAura ( ) const
inline

◆ HasPreventsFleeingAura()

bool Unit::HasPreventsFleeingAura ( ) const
inline
@ SPELL_AURA_PREVENTS_FLEEING
Definition: SpellAuraDefines.h:155

References HasAuraType(), and SPELL_AURA_PREVENTS_FLEEING.

Referenced by Creature::DoFleeToGetAssistance().

◆ HasRangedWeapon()

bool Unit::HasRangedWeapon ( ) const
inline
926{ return HasWeapon(RANGED_ATTACK); }

References HasWeapon(), and RANGED_ATTACK.

◆ HasRangedWeaponForAttack()

bool Unit::HasRangedWeaponForAttack ( ) const
inline

◆ HasReflectSpellsAura()

bool Unit::HasReflectSpellsAura ( ) const
inline
@ SPELL_AURA_REFLECT_SPELLS
Definition: SpellAuraDefines.h:91

References HasAuraType(), and SPELL_AURA_REFLECT_SPELLS.

Referenced by Spell::DoSpellHitOnUnit().

◆ HasRegenDuringCombatAura()

bool Unit::HasRegenDuringCombatAura ( ) const
inline
@ SPELL_AURA_MOD_REGEN_DURING_COMBAT
Definition: SpellAuraDefines.h:179

References HasAuraType(), and SPELL_AURA_MOD_REGEN_DURING_COMBAT.

Referenced by Player::RegenerateAll(), and Player::RegenerateHealth().

◆ HasRootAura()

bool Unit::HasRootAura ( ) const
inline

◆ HasShapeshiftAura()

bool Unit::HasShapeshiftAura ( ) const
inline

◆ HasSharedVision()

bool Unit::HasSharedVision ( ) const
inline

◆ HasSilenceAura()

bool Unit::HasSilenceAura ( ) const
inline

◆ HasSpell()

virtual bool Unit::HasSpell ( uint32  ) const
inlinevirtual

◆ HasSpellCooldown()

◆ HasSpellItemCooldown()

virtual bool Unit::HasSpellItemCooldown ( uint32  ,
uint32   
) const
inlinevirtual

Reimplemented in Player.

1265{ return false; }

Referenced by Spell::CheckCast(), and ProcDamageAndSpellFor().

◆ HasSpellMagnetAura()

bool Unit::HasSpellMagnetAura ( ) const
inline

◆ HasSpiritOfRedemptionAura()

◆ HasStealthAura()

◆ HasStealthDetectAura()

bool Unit::HasStealthDetectAura ( ) const
inline
@ SPELL_AURA_MOD_STEALTH_DETECT
Definition: SpellAuraDefines.h:80

References HasAuraType(), and SPELL_AURA_MOD_STEALTH_DETECT.

Referenced by AuraEffect::HandleModStealthDetect().

◆ HasStunAura()

◆ HasTauntAura()

bool Unit::HasTauntAura ( ) const
inline
@ SPELL_AURA_MOD_TAUNT
Definition: SpellAuraDefines.h:74

References HasAuraType(), and SPELL_AURA_MOD_TAUNT.

Referenced by Creature::CanCreatureAttack(), and PetAI::SelectNextTarget().

◆ HasThreatAura()

bool Unit::HasThreatAura ( ) const
inline
@ SPELL_AURA_MOD_THREAT
Definition: SpellAuraDefines.h:73

References HasAuraType(), and SPELL_AURA_MOD_THREAT.

Referenced by ApplyTotalThreatModifier().

◆ HasTransformAura()

bool Unit::HasTransformAura ( ) const
inline

◆ HasUnattackableAura()

bool Unit::HasUnattackableAura ( ) const
inline

◆ HasUnitFlag()

bool Unit::HasUnitFlag ( UnitFlags  flags) const
inline
702{ return HasFlag(UNIT_FIELD_FLAGS, flags); }

References Object::HasFlag(), and UNIT_FIELD_FLAGS.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), Vehicle::AddPassenger(), AttackerStateUpdate(), boss_malygos::boss_malygosAI::AttackStart(), SmartAI::AttackStart(), npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), violet_hold_trashAI::AttackStart(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::AttackStart(), npc_ravenous_worg::npc_ravenous_worgAI::AttackStart(), npc_swarm_scarab::npc_swarm_scarabAI::CanAIAttack(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanNoReagentCast(), CanSwim(), CanUseAttackType(), Spell::CheckEffectTarget(), boss_muru::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_jormungarAI::DoAction(), Spell::DoSpellHitOnUnit(), RandomMovementGenerator< T >::DoUpdate(), boss_dorothee::EnterEvadeMode(), boss_roar::EnterEvadeMode(), boss_strawman::EnterEvadeMode(), boss_tinhead::EnterEvadeMode(), boss_julianne::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GetReactionTo(), GetVelocity(), spell_gen_model_visible::HandleEffectApply(), WorldSession::HandleMovementOpcodes(), spell_gen_mounted_charge::HandleScriptEffect(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsMounted(), IsPetInCombat(), isTargetableForAttack(), violet_hold_trashAI::JustEngagedWith(), boss_novos::boss_novosAI::JustSummoned(), CreatureGroup::LeaderMoveTo(), Condition::Meets(), MotionMaster::MoveCharge(), MotionMaster::MoveChase(), MotionMaster::MoveConfused(), MotionMaster::MoveDistract(), MotionMaster::MoveFall(), MotionMaster::MoveFleeing(), MotionMaster::MoveFollow(), boss_professor_putricide::boss_professor_putricideAI::MoveInLineOfSight(), boss_palehoof::boss_palehoofAI::MoveInLineOfSight(), npc_massive_jormungar::npc_massive_jormungarAI::MoveInLineOfSight(), npc_ferocious_rhino::npc_ferocious_rhinoAI::MoveInLineOfSight(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::MoveInLineOfSight(), npc_frenzied_worgen::npc_frenzied_worgenAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), npc_nether_drake::npc_nether_drakeAI::MoveInLineOfSight(), MotionMaster::MoveLand(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), MotionMaster::MovePath(), MotionMaster::MovePoint(), MotionMaster::MoveRandom(), MotionMaster::MoveSeekAssistance(), MotionMaster::MoveSeekAssistanceDistract(), MotionMaster::MoveSplinePath(), MotionMaster::MoveTakeoff(), MotionMaster::MoveTargetedHome(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::myCanCast(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::RefreshSwimmingFlag(), ScriptedAI::SelectSpell(), Player::SetClientControl(), SetSpeed(), boss_anub_arak::boss_anub_arakAI::SummonedCreatureDies(), boss_the_lurker_below::SummonedCreatureDies(), Player::Update(), npc_onyxian_lair_guard::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_heart::npc_xt002_heartAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), and npc_ravenous_worg::npc_ravenous_worgAI::UpdateAI().

◆ HasUnitFlag2()

◆ HasUnitMovementFlag()

◆ HasUnitState()

bool Unit::HasUnitState ( const uint32  f) const
inline
691{ return (m_state & f); }

References m_state.

Referenced by Spell::_cast(), Creature::_IsTargetAcceptable(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), AddThreat(), advisor_baseAI::advisor_baseAI(), Attack(), AttackerStateUpdate(), FollowerAI::AttackStart(), SmartAI::AttackStart(), npc_raging_spirit::npc_raging_spiritAI::AttackStart(), boss_alar::boss_alar(), boss_anetheron::boss_anetheron(), boss_anzu::boss_anzu(), boss_apothecary_hummel::boss_apothecary_hummelAI::boss_apothecary_hummelAI(), boss_archimonde::boss_archimonde(), boss_azgalor::boss_azgalor(), boss_azuregos::boss_azuregosAI::boss_azuregosAI(), boss_balinda::boss_balinda(), boss_bigbadwolf::boss_bigbadwolf(), boss_blackheart_the_inciter::boss_blackheart_the_inciter(), boss_blindeye_the_seer::boss_blindeye_the_seer(), boss_captain_skarloc::boss_captain_skarloc(), boss_curator::boss_curator(), boss_darkweaver_syth::boss_darkweaver_syth(), boss_dorothee::boss_dorothee(), boss_exarch_maladaar::boss_exarch_maladaar(), boss_fathomguard_caribdis::boss_fathomguard_caribdis(), boss_fathomguard_sharkkis::boss_fathomguard_sharkkis(), boss_fathomguard_tidalvess::boss_fathomguard_tidalvess(), boss_ghazan::boss_ghazan(), boss_grand_warlock_nethekurse::boss_grand_warlock_nethekurse(), boss_halazzi::boss_halazzi(), boss_hexlord_malacrass::boss_hexlord_malacrass(), boss_high_astromancer_solarian::boss_high_astromancer_solarian(), boss_high_king_maulgar::boss_high_king_maulgar(), boss_janalai::boss_janalai(), boss_jarien::boss_jarien(), boss_kazrogal::boss_kazrogal(), boss_kelidan_the_breaker::boss_kelidan_the_breaker(), boss_kiggler_the_crazed::boss_kiggler_the_crazed(), boss_kiljaeden::boss_kiljaeden(), boss_krik_thir::boss_krik_thirAI::boss_krik_thirAI(), boss_krosh_firehand::boss_krosh_firehand(), boss_lady_vashj::boss_lady_vashj(), boss_magtheridon::boss_magtheridon(), boss_maiden_of_virtue::boss_maiden_of_virtue(), boss_mekgineer_steamrigger::boss_mekgineer_steamrigger(), boss_mennu_the_betrayer::boss_mennu_the_betrayer(), boss_mor_grayhoof::boss_mor_grayhoof(), boss_moroes::boss_moroes(), boss_morogrim_tidewalker::boss_morogrim_tidewalker(), boss_murmur::boss_murmur(), boss_nazan::boss_nazan(), boss_nexusprince_shaffar::boss_nexusprince_shaffar(), boss_olm_the_summoner::boss_olm_the_summoner(), boss_omor_the_unscarred::boss_omor_the_unscarred(), boss_pandemonius::boss_pandemonius(), boss_quagmirran::boss_quagmirran(), boss_rage_winterchill::boss_rage_winterchill(), boss_roar::boss_roar(), boss_rokmar_the_crackler::boss_rokmar_the_crackler(), boss_shirrak_the_dead_watcher::boss_shirrak_the_dead_watcher(), boss_sothos::boss_sothos(), boss_strawman::boss_strawman(), boss_supremus::boss_supremus(), boss_swamplord_muselek::boss_swamplord_muselek(), boss_taldaram::boss_taldaram(), boss_talon_king_ikiss::boss_talon_king_ikiss(), boss_tavarok::boss_tavarok(), boss_tenris_mirkblood::boss_tenris_mirkblood(), boss_terestian_illhoof::boss_terestian_illhoof(), boss_the_black_stalker::boss_the_black_stalker(), boss_the_maker::boss_the_maker(), boss_tinhead::boss_tinhead(), boss_vazruden::boss_vazruden(), boss_void_reaver::boss_void_reaver(), boss_warbringer_omrogg::boss_warbringer_omrogg(), boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefist(), boss_watchkeeper_gargolmar::boss_watchkeeper_gargolmar(), PathGenerator::CalculatePath(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), boss_gurtogg_bloodboil::CanAIAttack(), PetAI::CanAttack(), Player::CanEquipItem(), CanFreeMove(), Creature::CanPeriodicallyCallForAssistance(), Creature::CanStartAttack(), spell_dk_death_grip::CheckCast(), Spell::CheckCast(), Spell::CheckPetCast(), spell_warr_retaliation::CheckProc(), SpellInfo::CheckTarget(), CreatureUnitRelocationWorker(), boss_garfrost::boss_garfrostAI::DamageTaken(), BossAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), DealDamage(), DealMeleeDamage(), DisableRotate(), UnitAI::DoCast(), UnitAI::DoCastAOE(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), Spell::DoSpellHitOnUnit(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), Spell::EffectDistract(), Spell::EffectEnergize(), Spell::EffectHealMaxHealth(), Spell::EffectKnockBack(), CritterAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Spell::finish(), Player::GetInitialVisiblePackets(), WorldSession::HandleAuctionListItems(), spell_dru_starfall_dummy::HandleDummy(), WorldSession::HandleEmoteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleMoveTeleportAck(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), AuraEffect::HandleProcTriggerDamageAuraProc(), ArenaSpectator::HandleSpectatorSpectateCommand(), boss_venoxis::InitializeAI(), isAttackingPlayer(), boss_faction_championsAI::IsCCed(), Creature::IsInEvadeMode(), IsInFlight(), IsMovementPreventedByCasting(), Creature::IsMovementPreventedByCasting(), isPossessed(), isPossessedByPlayer(), isSpellBlocked(), IsStopped(), isTargetableForAttack(), Creature::IsUpdateNeeded(), IsValidCombatTarget(), CritterAI::JustEngagedWith(), boss_priestess_delrissa::JustEngagedWith(), npc_coren_direbrew_sisters::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), boss_essence_of_desire::boss_essence_of_desireAI::JustEngagedWith(), boss_priestess_lackey_commonAI::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), PetAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), GridObjectLoader::LoadCreatures(), MagicSpellHitResult(), MeleeSpellHitResult(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_kaelthas::MovementInform(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_hunter::npc_toc_hunterAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_warrior::npc_toc_warriorAI::myCanCast(), npc_toc_dk::npc_toc_dkAI::myCanCast(), npc_toc_rogue::npc_toc_rogueAI::myCanCast(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::myCanCast(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::myCanCast(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_apothecary_baxter::npc_apothecary_baxter(), npc_batrider::npc_batrider(), npc_hyjal_frost_wyrm::npc_hyjal_frost_wyrm(), npc_hyjal_gargoyle::npc_hyjal_gargoyle(), npc_hyjal_ground_trash::npc_hyjal_ground_trash(), npc_icc_spire_frostwyrm::npc_icc_spire_frostwyrm(), npc_inner_demon::npc_inner_demon(), npc_kiljaeden_controller::npc_kiljaeden_controller(), npc_sunblade_arch_mage::npc_sunblade_arch_mage(), BossAI::OnSpellCastFinished(), Acore::FriendlyCCedInRange::operator()(), MysticBuffetTargetFilter::operator()(), SmartScript::ProcessAction(), RemoveCharmedBy(), boss_kormok::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), npc_ohgan::npc_ohganAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_isalien::Reset(), npc_anubisath_guardian::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_ashtongue_channeler::Reset(), RollMeleeOutcomeAgainst(), boss_faction_championsAI::SelectEnemyCaster(), ThreatContainer::SelectNextVictim(), Player::SetClientControl(), SetContestedPvP(), SetControlled(), Creature::SetDisableGravity(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Creature::SetHover(), SetInCombatState(), SetInFront(), SetRooted(), SetStunned(), WaypointMovementGenerator< Creature >::StartMove(), lfg::LFGMgr::TeleportPlayer(), CreatureAI::TriggerAlert(), Creature::Update(), Player::Update(), Update(), TimedFleeingMovementGenerator::Update(), boss_sartharion_dragonAI::UpdateAI(), CombatAI::UpdateAI(), CasterAI::UpdateAI(), BossAI::UpdateAI(), WorldBossAI::UpdateAI(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::UpdateAI(), ironhand_guardian::ironhand_guardianAI::UpdateAI(), boss_anubshiah::boss_anubshiahAI::UpdateAI(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::UpdateAI(), boss_eviscerator::boss_evisceratorAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_moira_bronzebeardAI::UpdateAI(), boss_high_priestess_thaurissanAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_halycon::boss_halyconAI::UpdateAI(), boss_highlord_omokk::boss_highlordomokkAI::UpdateAI(), boss_lord_valthalak::boss_lord_valthalakAI::UpdateAI(), boss_overlord_wyrmthalak::boss_overlordwyrmthalakAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_solakar_flamewreath::boss_solakar_flamewreathAI::UpdateAI(), boss_the_beast::boss_thebeastAI::UpdateAI(), boss_urok_doomhowl::boss_urok_doomhowlAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_chromaggus::boss_chromaggusAI::UpdateAI(), boss_ebonroc::boss_ebonrocAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_nefarian::UpdateAI(), boss_razorgore::boss_razorgoreAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_garr::boss_garrAI::UpdateAI(), boss_golemagg::boss_golemaggAI::UpdateAI(), npc_core_rager::npc_core_ragerAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_flamewaker_priest::npc_flamewaker_priestAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), boss_netherspite::UpdateAI(), boss_servant_quarters::UpdateAI(), npc_kilrek::UpdateAI(), boss_priestess_lackey_commonAI::UpdateAI(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), boss_blight_worm::boss_blight_wormAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_coren_direbrew::UpdateAI(), npc_hallows_end_soh::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), boss_onyxia::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), npc_belnistrasz::npc_belnistraszAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_volazj::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), npc_rotting_frost_giant::npc_rotting_frost_giantAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_captain_arnath::npc_captain_arnathAI::UpdateAI(), npc_captain_brandon::npc_captain_brandonAI::UpdateAI(), npc_captain_grondel::npc_captain_grondelAI::UpdateAI(), npc_captain_rupert::npc_captain_rupertAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razuvious_minion::boss_razuvious_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir::boss_sjonnirAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_dalronn_the_controller::UpdateAI(), npc_enslaved_proto_drake::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_exarch_maladaar::UpdateAI(), boss_nexusprince_shaffar::UpdateAI(), npc_yor::UpdateAI(), boss_anzu::UpdateAI(), npc_maiev_illidan::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_high_nethermancer_zerevor::UpdateAI(), boss_lady_malande::UpdateAI(), boss_veras_darkshadow::UpdateAI(), boss_essence_of_suffering::boss_essence_of_sufferingAI::UpdateAI(), boss_essence_of_desire::boss_essence_of_desireAI::UpdateAI(), boss_essence_of_anger::boss_essence_of_angerAI::UpdateAI(), boss_doomlord_kazzak::boss_doomlordkazzakAI::UpdateAI(), boss_doomwalker::UpdateAI(), boss_leotheras_the_blind::UpdateAI(), boss_gruul::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), boss_watchkeeper_gargolmar::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), boss_alar::UpdateAI(), advisor_baseAI::UpdateAI(), npc_maghar_captive::npc_maghar_captiveAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), emerald_dragonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), PetAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_wg_spirit_guide::npc_wg_spirit_guideAI::UpdateAI(), Player::UpdateCharmedAI(), npc_general_andorov::UpdateEscortAI(), npc_onyx_flamecaller::npc_onyx_flamecallerAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), npc_kurenai_captive::npc_kurenai_captiveAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), SmartAI::UpdatePath(), and SmartScript::UpdateTimer().

◆ HasUnitTypeMask()

◆ HasVisibleAuraType()

bool Unit::HasVisibleAuraType ( AuraType  auraType) const
5808{
5809 AuraEffectList const& mAuraList = GetAuraEffectsByType(auraType);
5810 for (AuraEffectList::const_iterator i = mAuraList.begin(); i != mAuraList.end(); ++i)
5811 if ((*i)->GetBase()->CanBeSentToClient())
5812 return true;
5813
5814 return false;
5815}

References GetAuraEffectsByType().

◆ HasWaterBreathingAura()

bool Unit::HasWaterBreathingAura ( ) const
inline
@ SPELL_AURA_WATER_BREATHING
Definition: SpellAuraDefines.h:145

References HasAuraType(), and SPELL_AURA_WATER_BREATHING.

Referenced by Player::getMaxTimer().

◆ HasWaterWalkAura()

bool Unit::HasWaterWalkAura ( ) const
inline
@ SPELL_AURA_WATER_WALK
Definition: SpellAuraDefines.h:167

References HasAuraType(), and SPELL_AURA_WATER_WALK.

Referenced by Player::GetAurasForTarget().

◆ HasWeapon()

virtual bool Unit::HasWeapon ( WeaponAttackType  type) const
pure virtual

Implemented in Creature, and Player.

Referenced by HasMainhandWeapon(), HasOffhandWeapon(), and HasRangedWeapon().

◆ HasWeaponForAttack()

virtual bool Unit::HasWeaponForAttack ( WeaponAttackType  type) const
inlinevirtual

Reimplemented in Creature, and Player.

929{ return CanUseAttackType(type); }
bool CanUseAttackType(uint8 attacktype) const
Definition: Unit.h:933

References CanUseAttackType().

Referenced by hasMainhandWeaponForAttack(), HasMainhandWeaponForAttack(), HasOffhandWeaponForAttack(), HasRangedWeaponForAttack(), Creature::HasWeaponForAttack(), and Player::HasWeaponForAttack().

◆ haveOffhandWeapon()

bool Unit::haveOffhandWeapon ( ) const
524{
525 if (Player const* player = ToPlayer())
526 return player->GetWeaponForAttack(OFF_ATTACK, true);
527
528 return CanDualWield();
529}
bool CanDualWield() const
Definition: Unit.h:920

References CanDualWield(), OFF_ATTACK, and Object::ToPlayer().

Referenced by boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), and boss_twin_valkyrAI::myDoMeleeAttackIfReady().

◆ HealBySpell()

int32 Unit::HealBySpell ( HealInfo healInfo,
bool  critical = false 
)
11337{
11338 uint32 heal = healInfo.GetHeal();
11339 sScriptMgr->ModifyHealReceived(this, healInfo.GetTarget(), heal, healInfo.GetSpellInfo());
11340 healInfo.SetHeal(heal);
11341
11342 // calculate heal absorb and reduce healing
11343 CalcHealAbsorb(healInfo);
11344
11345 int32 gain = Unit::DealHeal(healInfo.GetHealer(), healInfo.GetTarget(), healInfo.GetHeal());
11346 healInfo.SetEffectiveHeal(gain);
11347
11348 SendHealSpellLog(healInfo, critical);
11349 return gain;
11350}
Unit * GetHealer() const
Definition: Unit.h:411
void SetHeal(uint32 amount)
Definition: Unit.h:401
void SetEffectiveHeal(uint32 amount)
Definition: Unit.h:406
static void CalcHealAbsorb(HealInfo &healInfo)
Definition: Unit.cpp:2534
static int32 DealHeal(Unit *healer, Unit *victim, uint32 addhealth)
Definition: Unit.cpp:11046
void SendHealSpellLog(HealInfo const &healInfo, bool critical=false)
Definition: Unit.cpp:11319

References CalcHealAbsorb(), DealHeal(), HealInfo::GetHeal(), HealInfo::GetHealer(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SendHealSpellLog(), HealInfo::SetEffectiveHeal(), HealInfo::SetHeal(), and sScriptMgr.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ HealthAbovePct()

◆ HealthAbovePctHealed()

bool Unit::HealthAbovePctHealed ( int32  pct,
uint32  heal 
) const
inline

◆ HealthBelowPct()

bool Unit::HealthBelowPct ( int32  pct) const
inline
1041{ return GetHealth() < CountPctFromMaxHealth(pct); }

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_moira_bronzebeardAI::CastOnEmperorIfPossible(), boss_mor_grayhoof::DamageTaken(), boss_isalien::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::DamageTaken(), boss_hadronox::boss_hadronoxAI::DamageTaken(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), HandleProcTriggerSpell(), ScriptedAI::HealthBelowPct(), boss_kalec::JustEngagedWith(), boss_sathrovarr::JustEngagedWith(), npc_akama_illidan::JustEngagedWith(), npc_maiev_illidan::JustEngagedWith(), boss_olm_the_summoner::JustEngagedWith(), boss_priestess_lackey_commonAI::JustEngagedWith(), boss_yazzai::JustEngagedWith(), boss_grand_warlock_nethekurse::JustEngagedWith(), Player::LoadFromDB(), npc_death_knight_initiate::OnGossipHello(), SetHealth(), SpellPctHealingModsDone(), Update(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), and npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI().

◆ HealthBelowPctDamaged()

bool Unit::HealthBelowPctDamaged ( int32  pct,
uint32  damage 
) const
inline
1042{ return int64(GetHealth()) - int64(damage) < int64(CountPctFromMaxHealth(pct)); }
std::int64_t int64
Definition: Define.h:102

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_mandokir::boss_mandokirAI::DamageDealt(), boss_lord_valthalak::boss_lord_valthalakAI::DamageTaken(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::DamageTaken(), boss_quartermaster_zigris::DamageTaken(), boss_warmaster_voone::boss_warmastervooneAI::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_golemagg::boss_golemaggAI::DamageTaken(), npc_core_rager::npc_core_ragerAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_kormok::DamageTaken(), npc_batrider::DamageTaken(), npc_coren_direbrew::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_onyxia::DamageTaken(), npc_anubisath_guardian::DamageTaken(), boss_ouro::DamageTaken(), npc_anubisath_sentinel::aqsentinelAI::DamageTaken(), npc_anubisath_defender::DamageTaken(), boss_elder_nadox::DamageTaken(), boss_volazj::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), npc_xt002_boombot::npc_xt002_boombotAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_vazruden::DamageTaken(), npc_millhouse_manastorm::npc_millhouse_manastormAI::DamageTaken(), npc_magister_aledis::DamageTaken(), BossAI::DamageTaken(), boss_halazzi::DamageTaken(), boss_buru::DamageTaken(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), boss_bug_trio::DamageTaken(), boss_hadronox::boss_hadronoxAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), and HandleProcTriggerSpell().

◆ IncrDiminishing()

void Unit::IncrDiminishing ( DiminishingGroup  group)
15135{
15136 // Checking for existing in the table
15137 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15138 {
15139 if (i->DRGroup != group)
15140 continue;
15141 if (int32(i->hitCount) < GetDiminishingReturnsMaxLevel(group))
15142 i->hitCount += 1;
15143 return;
15144 }
15146}
DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group)
Definition: SpellMgr.cpp:264
Definition: Unit.h:273

References DIMINISHING_LEVEL_2, GetDiminishingReturnsMaxLevel(), GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ InitCharmInfo()

CharmInfo * Unit::InitCharmInfo ( )
15899{
15900 if (!m_charmInfo)
15901 m_charmInfo = new CharmInfo(this);
15902
15903 return m_charmInfo;
15904}
Definition: CharmInfo.h:127

References m_charmInfo.

Referenced by Guardian::Guardian(), Pet::Pet(), and SetCharmedBy().

◆ InitStatBuffMods()

void Unit::InitStatBuffMods ( )
inline
1011 {
1012 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + i, 0);
1013 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + i, 0);
1014 }

References STAT_STRENGTH, UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::InitStatsForLevel().

◆ InitTamedPet()

bool Unit::InitTamedPet ( Pet pet,
uint8  level,
uint32  spell_id 
)
17479{
17480 Player* player = ToPlayer();
17481 PetStable& petStable = player->GetOrInitPetStable();
17482 if (petStable.CurrentPet || petStable.GetUnslottedHunterPet())
17483 return false;
17484
17485 pet->SetCreatorGUID(GetGUID());
17486 pet->SetFaction(GetFaction());
17487 pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, spell_id);
17488
17489 if (IsPlayer())
17491
17492 if (!pet->InitStatsForLevel(level))
17493 {
17494 LOG_ERROR("entities.unit", "Pet::InitStatsForLevel() failed for creature (Entry: {})!", pet->GetEntry());
17495 return false;
17496 }
17497
17498 pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
17499 // this enables pet details window (Shift+P)
17500 pet->InitPetCreateSpells();
17501 pet->SetFullHealth();
17502 pet->FillPetInfo(&petStable.CurrentPet.emplace());
17503 return true;
17504}
@ UNIT_CREATED_BY_SPELL
Definition: UpdateFields.h:138
bool InitStatsForLevel(uint8 level)
Definition: Pet.cpp:1018
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition: Pet.cpp:2477
void InitPetCreateSpells()
Definition: Pet.cpp:2052
Definition: PetDefines.h:209
PetInfo const * GetUnslottedHunterPet() const
Definition: PetDefines.h:237
Optional< PetInfo > CurrentPet
Definition: PetDefines.h:232
PetStable & GetOrInitPetStable()
Definition: Player.cpp:15608
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition: CharmInfo.cpp:240
void SetFullHealth()
Definition: Unit.h:1051
void SetFaction(uint32 faction)
Definition: Unit.cpp:10126
void ReplaceAllUnitFlags(UnitFlags flags)
Remove the Unit flag specify only.
Definition: Unit.h:705
CharmInfo * GetCharmInfo()
Definition: Unit.h:1210
void SetCreatorGUID(ObjectGuid creator)
Definition: Unit.h:671

References PetStable::CurrentPet, Pet::FillPetInfo(), GetCharmInfo(), Object::GetEntry(), GetFaction(), Object::GetGUID(), Player::GetOrInitPetStable(), PetStable::GetUnslottedHunterPet(), Pet::InitPetCreateSpells(), Guardian::InitStatsForLevel(), Object::IsPlayer(), LOG_ERROR, ReplaceAllUnitFlags(), SetCreatorGUID(), SetFaction(), SetFullHealth(), CharmInfo::SetPetNumber(), SetUInt32Value(), sObjectMgr, Object::ToPlayer(), UNIT_CREATED_BY_SPELL, and UNIT_FLAG_PLAYER_CONTROLLED.

Referenced by CreateTamedPetFrom().

◆ InterruptNonMeleeSpells()

void Unit::InterruptNonMeleeSpells ( bool  withDelayed,
uint32  spellid = 0,
bool  withInstant = true,
bool  bySelf = false 
)
4186{
4187 // generic spells are interrupted if they are not finished or delayed
4188 if (m_currentSpells[CURRENT_GENERIC_SPELL] && (!spell_id || m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->Id == spell_id))
4189 InterruptSpell(CURRENT_GENERIC_SPELL, withDelayed, withInstant, bySelf);
4190
4191 // autorepeat spells are interrupted if they are not finished or delayed
4192 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && (!spell_id || m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id == spell_id))
4193 InterruptSpell(CURRENT_AUTOREPEAT_SPELL, withDelayed, withInstant, bySelf);
4194
4195 // channeled spells are interrupted if they are not finished, even if they are delayed
4196 if (m_currentSpells[CURRENT_CHANNELED_SPELL] && (!spell_id || m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id == spell_id))
4197 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4198}

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, InterruptSpell(), and m_currentSpells.

Referenced by _EnterVehicle(), PetAI::_stopAttack(), Player::ActivateSpec(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), CleanupBeforeRemoveFromMap(), CombatStop(), boss_julianne::DamageTaken(), boss_onyxia::DamageTaken(), boss_volazj::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), DealDamage(), boss_leotheras_the_blind::DemonTime(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_akilzon::DoAction(), npc_medivh_bm::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_nazan::DoAction(), npc_ranshalla::npc_ranshallaAI::DoContinueEscort(), Spell::EffectKnockBack(), boss_leotheras_the_blind::ElfTime(), boss_felblood_kaelthas::GravityLapseSequence(), spell_dk_death_grip::HandleBaseDummy(), WorldSession::HandleCancelCastOpcode(), spell_magtheridon_shadow_grasp::HandleDummyRemove(), spell_novos_crystal_handler_death_aura::HandleEffectApply(), spell_hydross_cleansing_field_command::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLootOpcode(), WorldSession::HandlePetActionHelper(), spell_the_lich_king_jump::HandleScript(), npc_kilrek::JustEngagedWith(), boss_archimonde::JustEngagedWith(), boss_infinite_corruptor::boss_infinite_corruptorAI::JustEngagedWith(), boss_taldaram::JustEngagedWith(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_curator::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustEngagedWith(), boss_gal_darah::boss_gal_darahAI::JustEngagedWith(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustEngagedWith(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustEngagedWith(), violet_hold_trashAI::JustEngagedWith(), PetAI::KilledUnit(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_shade_of_aran::OnPowerUpdate(), boss_jeklik::PathEndReached(), npc_akama_illidan::PathEndReached(), PretendToDie(), boss_alar::PretendToDie(), SmartScript::ProcessAction(), RemoveAurasWithInterruptFlags(), boss_curator::Reset(), boss_malchezaar::Reset(), boss_varos::boss_varosAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), boss_talon_king_ikiss::Reset(), boss_high_astromancer_solarian::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), boss_illidan_stormrage::ScheduleAbilities(), boss_the_lurker_below::SchedulerPhaseOne(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), boss_anomalus::SetData(), setDeathState(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), StopAttackFaction(), Player::TeleportTo(), CasterAI::UpdateAI(), TotemAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and PetAI::UpdateAI().

◆ InterruptSpell()

void Unit::InterruptSpell ( CurrentSpellTypes  spellType,
bool  withDelayed = true,
bool  withInstant = true,
bool  bySelf = false 
)
4114{
4115 //LOG_DEBUG("entities.unit", "Interrupt spell for unit {}.", GetEntry());
4116 Spell* spell = m_currentSpells[spellType];
4117 if (spell
4118 && (withDelayed || spell->getState() != SPELL_STATE_DELAYED)
4119 && (withInstant || spell->GetCastTime() > 0 || spell->getState() == SPELL_STATE_CASTING)) // xinef: or spell is in casting state (channeled spells only)
4120 {
4121 // for example, do not let self-stun aura interrupt itself
4122 if (!spell->IsInterruptable())
4123 return;
4124
4125 // send autorepeat cancel message for autorepeat spells
4126 if (spellType == CURRENT_AUTOREPEAT_SPELL)
4127 if (IsPlayer())
4129
4130 if (spell->getState() != SPELL_STATE_FINISHED)
4131 spell->cancel(bySelf);
4132 else
4133 {
4134 m_currentSpells[spellType] = nullptr;
4135 spell->SetReferencedFromCurrent(false);
4136 }
4137
4138 if (IsCreature() && IsAIEnabled)
4140 }
4141}
@ SPELL_FINISHED_CANCELED
Definition: Spell.h:99
@ SPELL_STATE_DELAYED
Definition: Spell.h:239
virtual void OnSpellCastFinished(SpellInfo const *, SpellFinishReason)
Definition: CreatureAI.h:151
void SendAutoRepeatCancel(Unit *target)
Definition: PlayerMisc.cpp:152
bool IsInterruptable() const
Definition: Spell.h:572
int32 GetCastTime() const
Definition: Spell.h:558
uint32 getState() const
Definition: Spell.h:493
void cancel(bool bySelf=false)
Definition: Spell.cpp:3636

References Creature::AI(), Spell::cancel(), CURRENT_AUTOREPEAT_SPELL, Spell::GetCastTime(), Spell::GetSpellInfo(), Spell::getState(), IsAIEnabled, Object::IsCreature(), Spell::IsInterruptable(), Object::IsPlayer(), m_currentSpells, CreatureAI::OnSpellCastFinished(), Player::SendAutoRepeatCancel(), Spell::SetReferencedFromCurrent(), SPELL_FINISHED_CANCELED, SPELL_STATE_CASTING, SPELL_STATE_DELAYED, SPELL_STATE_FINISHED, Object::ToCreature(), and Object::ToPlayer().

Referenced by _UpdateAutoRepeatSpell(), Player::ActivateTaxiPathTo(), Attack(), AttackStop(), CastStop(), Spell::EffectInterruptCast(), Spell::EffectSanctuary(), AuraEffect::HandleAuraModSilence(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandleCancelAutoRepeatSpellOpcode(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleCancelChanneling(), spell_hun_scatter_shot::HandleDummy(), AuraEffect::HandleFeignDeath(), InterruptNonMeleeSpells(), SmartAI::JustEngagedWith(), Player::RemoveItemDependentAurasAndCasts(), SetCurrentCastedSpell(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_nightbane::TriggerHealthTakeOff(), and npc_belnistrasz::npc_belnistraszAI::UpdateAI().

◆ InvalidateValuesUpdateCache()

void Unit::InvalidateValuesUpdateCache ( )
inlineprivate
2143{ _valuesUpdateCache.clear(); }

References _valuesUpdateCache.

Referenced by SetUInt32Value(), and Update().

◆ IsAlive()

bool Unit::IsAlive ( ) const
inline
1710{ return (m_deathState == DeathState::Alive); };

References m_deathState.

Referenced by _CreateAuraApplication(), CreatureAI::_EnterEvadeMode(), _EnterVehicle(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::_LoadItem(), BossAI::_Reset(), WorldBossAI::_Reset(), KillRewarder::_RewardHonor(), KillRewarder::_RewardKillCredit(), KillRewarder::_RewardXP(), PetAI::_stopAttack(), AddAura(), Map::AddPlayerToMap(), HostileReference::AddThreat(), Spell::AddUnitTarget(), Attack(), PetAI::AttackedBy(), AttackerStateUpdate(), boss_freya::boss_freyaAI::boss_freyaAI(), boss_hodir::boss_hodirAI::boss_hodirAI(), boss_mimiron::boss_mimironAI::boss_mimironAI(), boss_thorim::boss_thorimAI::boss_thorimAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), Player::BuyItemFromVendorSlot(), CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), instance_ruins_of_ahnqiraj::instance_ruins_of_ahnqiraj_InstanceMapScript::CallNextRajaxxLeader(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanCaptureTowerPoint(), CanHaveThreatList(), Player::CanInteractWithQuestGiver(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CanUseItem(), Player::CastItemCombatSpell(), Player::CheckAreaExploreAndOutdoor(), spell_dk_raise_ally::CheckCast(), spell_hun_check_pet_los::CheckCast(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), spell_hun_bestial_wrath::CheckCast(), Spell::CheckCast(), boss_gothik::boss_gothikAI::CheckGroupSplitted(), BattlegroundRV::CheckPositionForUnit(), spell_mage_focus_magic::CheckProc(), spell_dk_blood_caked_blade::CheckProc(), spell_dk_dancing_rune_weapon::CheckProc(), spell_item_necrotic_touch::CheckProc(), spell_pal_seal_of_righteousness::CheckProc(), spell_warl_siphon_life::CheckProc(), spell_putricide_mutation_init::CheckRequirementInternal(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CreatureUnitRelocationWorker(), DealDamage(), DealDamageMods(), DealMeleeDamage(), DealSpellDamage(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), Creature::DisappearAndDie(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_xerestrasza::npc_xerestraszaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), boss_high_king_maulgar::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_infinite_corruptor::boss_infinite_corruptorAI::DoAction(), boss_tharon_ja::boss_tharon_jaAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::DoAllEffectOnTarget(), spell_hun_masters_call::DoCheckCast(), RandomMovementGenerator< T >::DoInitialize(), WorldSession::DoLootRelease(), WaypointMovementGenerator< Creature >::DoUpdate(), instance_blackrock_spire::instance_blackrock_spireMapScript::Dragonspireroomcheck(), Spell::EffectAddExtraAttacks(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectEnvironmentalDMG(), Spell::EffectFeedPet(), Spell::EffectHeal(), Spell::EffectHealMaxHealth(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), Spell::EffectHealthLeech(), Spell::EffectInstaKill(), Spell::EffectInterruptCast(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectResurrect(), Spell::EffectResurrectNew(), Spell::EffectResurrectPet(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSelfResurrect(), Spell::EffectSkinPlayerCorpse(), Spell::EffectStuck(), Spell::EffectThreat(), Spell::EffectWeaponDmg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Player::EnvironmentalDamage(), Player::EquipItem(), BattleExperienceEvent::Execute(), ResetToHomeOrientation::Execute(), DelayedMovementEvent::Execute(), IceTombSummonEvent::Execute(), SACActivateEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), AssistanceMovementGenerator::Finalize(), Creature::ForcedDespawn(), CreatureGroup::FormationReset(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::GetData(), GetDebugInfo(), Player::GetInitialVisiblePackets(), FollowerAI::GetLeaderForFollower(), Player::getMaxTimer(), CreatureGroup::GetNewTargetForMember(), Player::GetNPCIfCanInteractWith(), GetPartyMembers(), npc_air_force_bots::npc_air_force_botsAI::GetSummonedGuard(), npc_wild_wyrm::npc_wild_wyrmAI::GetValidPlayer(), Pet::GivePetXP(), Player::GiveXP(), go_wind_stone::go_wind_stoneAI::GossipSelect(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), BattlegroundEY::HandleAreaTrigger(), BattlegroundWS::HandleAreaTrigger(), WorldSession::HandleAreaTriggerOpcode(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModTotalThreat(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattleFieldPortOpcode(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), HandleDummyAuraProc(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), WorldSession::HandleEmoteOpcode(), Player::HandleFall(), misc_commandscript::HandleFreezeCommand(), spell_chapter5_return_to_capital::HandleHit(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMessagechatOpcode(), AuraEffect::HandleModTaunt(), AuraEffect::HandleModTotalPercentStat(), WorldSession::HandleMovementOpcodes(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), AuraEffect::HandleObsModPowerAuraTick(), spell_yogg_saron_brain_link_aura::HandleOnEffectApply(), WorldSession::HandleOpenItemOpcode(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetAction(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandlePetStopAttack(), misc_commandscript::HandlePInfoCommand(), spell_pal_seal_of_command_aura::HandleProc(), HandleProcTriggerSpell(), WorldSession::HandleReclaimCorpseOpcode(), WorldSession::HandleRepopRequestOpcode(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), WorldSession::HandleSetAmmoOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleSummonResponseOpcode(), WorldSession::HandleUnstablePet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), boss_moroes::InitializeGuests(), Player::IsAtGroupRewardDistance(), Player::IsAtRecruitAFriendDistance(), Creature::IsInvisibleDueToDespawn(), Player::IsOutdoorPvPActive(), Player::IsPetNeedBeTemporaryUnsummoned(), isTargetableForAttack(), IsValidCombatTarget(), Spell::IsValidDeadOrAliveTarget(), ThreatCalcHelper::isValidProcess(), npc_kilrek::JustDied(), boss_rajaxx::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_freya::boss_freyaAI::JustEngagedWith(), npc_underbat::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), boss_fathomlord_karathress::JustReachedHome(), boss_rotface::boss_rotfaceAI::JustSummoned(), Kill(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), Player::LoadCorpse(), GridObjectLoader::LoadCreatures(), Player::LoadFromDB(), MagicSpellHitResult(), AchievementCriteriaData::Meets(), CreatureGroup::MemberEngagingTarget(), CreatureGroup::MemberEvaded(), npc_twiggy_flathead::npc_twiggy_flatheadAI::MoveInLineOfSight(), boss_lord_marrowgar::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_uldaman::instance_uldaman_InstanceMapScript::OnCreatureCreate(), instance_temple_of_ahnqiraj::instance_temple_of_ahnqiraj_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), instance_shadow_labyrinth::instance_shadow_labyrinth_InstanceMapScript::OnCreatureCreate(), go_palehoof_sphere::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), spell_yogg_saron_brain_link_aura::OnPeriodic(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnPlayerEnter(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), at_orb_of_command::OnTrigger(), at_ancient_leaf::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), AreaTrigger_at_sentry_point::OnTrigger(), SmartTrigger::OnTrigger(), AreaTrigger_at_area_52_entrance::OnTrigger(), at_dragonspire_hall::OnTrigger(), at_blackrock_stadium::OnTrigger(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), at_commander_dawnforge::OnTrigger(), RisenArchmageCheck::operator()(), WretchedGhoulCleaner::operator()(), ValithriaDespawner::operator()(), Acore::NearestCreatureEntryWithLiveStateInObjectRangeCheck::operator()(), Acore::PlayerAtMinimumRangeAway::operator()(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), Acore::AnyPlayerInObjectRangeCheck::operator()(), Acore::NearestPlayerInObjectRangeCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::AnyUnitInObjectRangeCheck::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Acore::AnyDeadUnitCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::MostHPMissingGroupInRange::operator()(), FrostwingVrykulSearcher::operator()(), Acore::AllDeadCreaturesInRange::operator()(), ShadowTrapLKTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), DefileTargetSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), MapMgr::PlayerCannotEnter(), ProcDamageAndSpell(), RemoveCharmedBy(), Group::RemoveMember(), Player::RemovePet(), Battleground::RemovePlayerAtLeave(), Player::RepopAtGraveyard(), boss_kiljaeden::Reset(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::Reset(), boss_fathomlord_karathress::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), Creature::Respawn(), Player::RewardPlayerAndGroupAtEvent(), BossAI::ScheduleEnrageTimer(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), Player::SendLoot(), npc_corrupted_totem::SetAura(), instance_naxxramas::SetBossState(), SetConfused(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::SetData(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::SetData(), npc_enslaved_proto_drake::SetData(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::SetData(), boss_teron_gorefiend::SetData(), Player::setDeathState(), Creature::SetDisableGravity(), SetFeared(), Creature::SetHover(), SetInCombatState(), SetStunned(), Battlefield::ShowNpc(), npc_dark_iron_guzzler::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), WaypointMovementGenerator< Creature >::StartMove(), PassengerController::SummonCreatures(), boss_rend_blackhand::boss_rend_blackhandAI::SummonedCreatureDespawn(), boss_priestess_delrissa::SummonedCreatureDies(), Player::SwapItem(), lfg::LFGMgr::TeleportPlayer(), BattlegroundRV::TeleportUnitToNewZ(), Pet::Update(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Puppet::Update(), Player::Update(), Totem::Update(), Update(), TimedFleeingMovementGenerator::Update(), TotemAI::UpdateAI(), go_blood_drenched_door::go_blood_drenched_doorAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), PetAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_ringo::npc_ringoAI::UpdateFollowerAI(), InstanceScript::UpdateMinionState(), Creature::UpdateMovementFlags(), boss_netherspite::UpdatePortals(), boss_twin_valkyrAI::UpdateSharedHealth(), UpdateSplineMovement(), Player::UpdateZone(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsAlwaysDetectableFor()

bool Unit::IsAlwaysDetectableFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

14316{
14318 return true;
14319
14320 if (HasAuraTypeWithCaster(SPELL_AURA_MOD_STALKED, seer->GetGUID()))
14321 return true;
14322
14323 if (Player* ownerPlayer = GetSpellModOwner())
14324 if (Player const* seerPlayer = seer->ToPlayer())
14325 {
14326 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14327 return true;
14328 }
14329
14330 return false;
14331}
@ SPELL_AURA_MOD_STALKED
Definition: SpellAuraDefines.h:131
virtual bool IsAlwaysDetectableFor(WorldObject const *) const
Definition: Object.h:760

References Object::GetGUID(), GetSpellModOwner(), HasAuraTypeWithCaster(), WorldObject::IsAlwaysDetectableFor(), SPELL_AURA_MOD_STALKED, and Object::ToPlayer().

Referenced by Creature::IsAlwaysDetectableFor(), and Player::IsAlwaysDetectableFor().

◆ IsAlwaysVisibleFor()

bool Unit::IsAlwaysVisibleFor ( WorldObject const *  seer) const
overrideprotectedvirtual

: Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures.

Reimplemented from WorldObject.

14297{
14299 return true;
14300
14301 // Always seen by owner
14302 if (ObjectGuid guid = GetCharmerOrOwnerGUID())
14303 if (seer->GetGUID() == guid)
14304 return true;
14305
14306 if (Player const* seerPlayer = seer->ToPlayer())
14307 if (Unit* owner = GetOwner())
14308 if (Player* ownerPlayer = owner->ToPlayer())
14309 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14310 return true;
14311
14312 return false;
14313}
virtual bool IsAlwaysVisibleFor(WorldObject const *) const
Definition: Object.h:757

References GetCharmerOrOwnerGUID(), Object::GetGUID(), GetOwner(), WorldObject::IsAlwaysVisibleFor(), and Object::ToPlayer().

◆ IsArmorer()

bool Unit::IsArmorer ( ) const
inline
@ UNIT_NPC_FLAG_REPAIR
Definition: UnitDefines.h:329
bool HasNpcFlag(NPCFlags flags) const
Definition: Unit.h:718

References HasNpcFlag(), and UNIT_NPC_FLAG_REPAIR.

◆ isAttackingPlayer()

bool Unit::isAttackingPlayer ( ) const
10558{
10560 return true;
10561
10562 if (!m_Controlled.empty())
10563 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10564 if ((*itr)->isAttackingPlayer())
10565 return true;
10566
10567 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
10568 if (m_SummonSlot[i])
10569 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
10570 if (summon->isAttackingPlayer())
10571 return true;
10572
10573 return false;
10574}

References WorldObject::GetMap(), HasUnitState(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, and UNIT_STATE_ATTACK_PLAYER.

◆ isAttackReady()

◆ IsAttackSpeedOverridenShapeShift()

bool Unit::IsAttackSpeedOverridenShapeShift ( ) const
19345{
19346 // Mirroring clientside gameplay logic
19347 if (ShapeshiftForm form = GetShapeshiftForm())
19348 if (SpellShapeshiftFormEntry const* entry = sSpellShapeshiftFormStore.LookupEntry(form))
19349 return entry->attackSpeed > 0;
19350
19351 return false;
19352}

References GetShapeshiftForm(), and sSpellShapeshiftFormStore.

Referenced by Player::CalculateMinMaxDamage().

◆ IsAuctioner()

bool Unit::IsAuctioner ( ) const
inline
@ UNIT_NPC_FLAG_AUCTIONEER
Definition: UnitDefines.h:338

References HasNpcFlag(), and UNIT_NPC_FLAG_AUCTIONEER.

◆ IsBanker()

bool Unit::IsBanker ( ) const
inline
@ UNIT_NPC_FLAG_BANKER
Definition: UnitDefines.h:334

References HasNpcFlag(), and UNIT_NPC_FLAG_BANKER.

◆ IsBattleMaster()

bool Unit::IsBattleMaster ( ) const
inline

◆ isBeingLoaded()

virtual bool Unit::isBeingLoaded ( ) const
inlinevirtual

Reimplemented in Pet, and Player.

657{ return false;}

Referenced by Player::SetMover().

◆ isBlockCritical()

bool Unit::isBlockCritical ( )
3161{
3163 return true;
3164 return false;
3165}
@ SPELL_AURA_MOD_BLOCK_CRIT_CHANCE
Definition: SpellAuraDefines.h:316

References GetTotalAuraModifier(), roll_chance_i(), and SPELL_AURA_MOD_BLOCK_CRIT_CHANCE.

Referenced by CalculateMeleeDamage(), and CalculateSpellDamageTaken().

◆ IsCharmed()

◆ IsCharmedOwnedByPlayerOrPlayer()

bool Unit::IsCharmedOwnedByPlayerOrPlayer ( ) const
inline

◆ IsClass()

◆ IsContestedGuard()

bool Unit::IsContestedGuard ( ) const
inline
971 {
973 return entry->IsContestedGuardFaction();
974
975 return false;
976 }

References GetFactionTemplateEntry().

Referenced by Acore::NearestVisibleDetectableContestedGuardUnitCheck::operator()().

◆ IsControllableGuardian()

bool Unit::IsControllableGuardian ( ) const
inline

◆ IsControlledByPlayer()

◆ IsCreatedByPlayer()

bool Unit::IsCreatedByPlayer ( ) const
inline
1237{ return m_CreatedByPlayer; }

References m_CreatedByPlayer.

Referenced by DealDamage().

◆ IsCritter()

◆ IsCrowdControlled()

bool Unit::IsCrowdControlled ( ) const
inline
@ UNIT_FLAG_CONFUSED
Definition: UnitDefines.h:274
@ UNIT_FLAG_FLEEING
Definition: UnitDefines.h:275

References Object::HasFlag(), UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED, UNIT_FLAG_FLEEING, and UNIT_FLAG_STUNNED.

Referenced by SmartAI::SetCombatMovement().

◆ IsDamageReducedByArmor()

bool Unit::IsDamageReducedByArmor ( SpellSchoolMask  damageSchoolMask,
SpellInfo const *  spellInfo = nullptr,
uint8  effIndex = MAX_SPELL_EFFECTS 
)
static
2041{
2042 // only physical spells damage gets reduced by armor
2043 if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0)
2044 return false;
2045 if (spellInfo)
2046 {
2047 // there are spells with no specific attribute but they have "ignores armor" in tooltip
2048 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_ARMOR))
2049 return false;
2050
2051 // bleeding effects are not reduced by armor
2052 if (effIndex != MAX_SPELL_EFFECTS)
2053 {
2054 if (spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE ||
2055 spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
2056 if (spellInfo->GetEffectMechanicMask(effIndex) & (1 << MECHANIC_BLEED))
2057 return false;
2058 }
2059 }
2060 return true;
2061}
@ SPELL_ATTR0_CU_IGNORE_ARMOR
Definition: SpellInfo.h:191
@ MECHANIC_BLEED
Definition: SharedDefines.h:1351

References SpellInfo::Effects, SpellInfo::GetEffectMechanicMask(), SpellInfo::HasAttribute(), MAX_SPELL_EFFECTS, MECHANIC_BLEED, SPELL_ATTR0_CU_IGNORE_ARMOR, SPELL_AURA_PERIODIC_DAMAGE, SPELL_EFFECT_SCHOOL_DAMAGE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ isDead()

bool Unit::isDead ( ) const
inline
1712{ return (m_deathState == DeathState::Dead || m_deathState == DeathState::Corpse); };

References m_deathState.

Referenced by npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraDummy(), Player::HandleFall(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), misc_commandscript::HandleRespawnCommand(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), Creature::HasSpellFocus(), UnitAI::InitializeAI(), SmartAI::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_spinestalker::npc_spinestalkerAI::InitializeAI(), npc_rimefang::npc_rimefangAI::InitializeAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::InitializeAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), Player::isAllowedToLoot(), npc_anubisath_sentinel::aqsentinelAI::JustDied(), Player::OnGossipSelect(), AreaTrigger_at_stormwright_shelf::OnTrigger(), AreaTrigger_at_scent_larkorwi::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), Player::PrepareGossipMenu(), SmartScript::ProcessAction(), Player::RepopAtGraveyard(), npc_anubisath_sentinel::aqsentinelAI::Reset(), WorldSession::SendAttackStop(), SendMeleeAttackStop(), instance_molten_core::instance_molten_core_InstanceMapScript::SetBossState(), and npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI().

◆ IsDuringRemoveFromWorld()

◆ isDying()

bool Unit::isDying ( ) const
inline
1711{ return (m_deathState == DeathState::JustDied); };

References m_deathState.

Referenced by Creature::IsInvisibleDueToDespawn(), and SetHover().

◆ IsEngaged()

◆ IsEngagedBy()

bool Unit::IsEngagedBy ( Unit const *  who) const
inline

◆ IsFalling()

◆ IsFFAPvP()

bool Unit::IsFFAPvP ( ) const
inline

◆ IsFlying()

◆ IsFriendlyTo()

bool Unit::IsFriendlyTo ( Unit const *  unit) const
10312{
10313 return GetReactionTo(unit) >= REP_FRIENDLY;
10314}

References GetReactionTo(), and REP_FRIENDLY.

Referenced by Spell::_cast(), AuraApplication::_InitFlags(), Creature::_IsTargetAcceptable(), FollowerAI::AssistPlayerInCombatAgainst(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), Creature::CanAssistTo(), spell_dk_death_coil::CheckCast(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), Spell::CheckCast(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), Spell::EffectDispel(), Spell::EffectDispelMechanic(), Spell::EffectStealBeneficialBuff(), Spell::EffectThreat(), Aura::HandleAuraSpecificMods(), spell_dk_death_coil::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pri_penance::HandleDummy(), HandleDummyAuraProc(), BattlefieldWG::HandleKill(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), WorldSession::HandleSetSelectionOpcode(), Spell::HandleThreatSpells(), GameObject::IsAlwaysVisibleFor(), SpellClickInfo::IsFitToRequirements(), npc_draenei_survivor::npc_draenei_survivorAI::MoveInLineOfSight(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), PetSpellFail(), SmartScript::ProcessEvent(), RemoveCharmedBy(), Spell::SelectExplicitTargets(), Player::SendLoot(), Acore::MessageDistDelivererToHostile::SendPacket(), and TotemAI::UpdateAI().

◆ isFrozen()

◆ IsFullHealth()

◆ IsGossip()

bool Unit::IsGossip ( ) const
inline
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:317

References HasNpcFlag(), and UNIT_NPC_FLAG_GOSSIP.

◆ IsGuardian()

◆ IsGuildMaster()

bool Unit::IsGuildMaster ( ) const
inline
@ UNIT_NPC_FLAG_PETITIONER
Definition: UnitDefines.h:335

References HasNpcFlag(), and UNIT_NPC_FLAG_PETITIONER.

◆ IsHostileTo()

◆ IsHostileToPlayers()

bool Unit::IsHostileToPlayers ( ) const
10317{
10318 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10319 if (!my_faction || !my_faction->faction)
10320 return false;
10321
10322 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10323 if (raw_faction && raw_faction->reputationListID >= 0)
10324 return false;
10325
10326 return my_faction->IsHostileToPlayers();
10327}
int32 reputationListID
Definition: DBCStructure.h:909
uint32 faction
Definition: DBCStructure.h:941
bool IsHostileToPlayers() const
Definition: DBCStructure.h:981

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsHostileToPlayers(), FactionEntry::reputationListID, and sFactionStore.

◆ IsHovering()

◆ IsHunterPet()

◆ IsImmunedToDamage() [1/3]

bool Unit::IsImmunedToDamage ( Spell const *  spell) const
12890{
12891 SpellInfo const* spellInfo = spell->GetSpellInfo();
12892 if (!spellInfo)
12893 {
12894 return false;
12895 }
12896
12898 {
12899 return false;
12900 }
12901
12903 {
12904 return false;
12905 }
12906
12907 uint32 schoolMask = spell->GetSpellSchoolMask();
12908 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12909 {
12910 return false;
12911 }
12912
12913 // If m_immuneToDamage type contain magic, IMMUNE damage.
12914 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12915 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12916 {
12917 if ((itr->type & schoolMask) == schoolMask)
12918 {
12919 return true;
12920 }
12921 }
12922
12923 return false;
12924}
std::vector< SpellImmune > SpellImmuneList
Definition: SpellDefines.h:182
@ SPELL_ATTR2_NO_SCHOOL_IMMUNITIES
Definition: SharedDefines.h:493
@ SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS
Definition: SharedDefines.h:446
@ IMMUNITY_DAMAGE
Definition: SharedDefines.h:1408
@ SPELL_SCHOOL_MASK_NONE
Definition: SharedDefines.h:307

References Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [2/3]

bool Unit::IsImmunedToDamage ( SpellInfo const *  spellInfo) const
12858{
12859 if (!spellInfo)
12860 {
12861 return false;
12862 }
12863
12864 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
12865 {
12866 return false;
12867 }
12868
12869 if (spellInfo->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) || spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
12870 {
12871 return false;
12872 }
12873
12874 uint32 schoolMask = spellInfo->GetSchoolMask();
12875 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12876 {
12877 return false;
12878 }
12879
12880 // If m_immuneToDamage type contain magic, IMMUNE damage.
12881 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12882 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12883 if ((itr->type & schoolMask) == schoolMask)
12884 return true;
12885
12886 return false;
12887}

References SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [3/3]

bool Unit::IsImmunedToDamage ( SpellSchoolMask  meleeSchoolMask) const
12842{
12843 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12844 {
12845 return false;
12846 }
12847
12848 // If m_immuneToDamage type contain magic, IMMUNE damage.
12849 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12850 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12851 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
12852 return true;
12853
12854 return false;
12855}

References IMMUNITY_DAMAGE, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by boss_gurtogg_bloodboil::CanAIAttack(), Spell::DoSpellHitOnUnit(), and IsImmunedToDamageOrSchool().

◆ IsImmunedToDamageOrSchool() [1/2]

bool Unit::IsImmunedToDamageOrSchool ( SpellInfo const *  spellInfo) const
13006{
13007 return IsImmunedToDamage(spellInfo) || IsImmunedToSchool(spellInfo);
13008}
bool IsImmunedToSchool(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12926
bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12841

References IsImmunedToDamage(), and IsImmunedToSchool().

◆ IsImmunedToDamageOrSchool() [2/2]

◆ IsImmunedToSchool() [1/3]

bool Unit::IsImmunedToSchool ( Spell const *  spell) const
12966{
12967 SpellInfo const* spellInfo = spell->GetSpellInfo();
12969 {
12970 return false;
12971 }
12972
12973 uint32 schoolMask = spell->GetSpellSchoolMask();
12974 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12975 {
12976 return false;
12977 }
12978
12979 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12980 {
12981 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12982 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12983 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12984 {
12985 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12986 {
12987 return true;
12988 }
12989 }
12990 }
12991
12992 return false;
12993}
@ IMMUNITY_SCHOOL
Definition: SharedDefines.h:1407
bool CanPierceImmuneAura(SpellInfo const *aura) const
Definition: SpellInfo.cpp:1323

References SpellInfo::CanPierceImmuneAura(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [2/3]

bool Unit::IsImmunedToSchool ( SpellInfo const *  spellInfo) const
12943{
12944 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
12945 return false;
12946
12947 uint32 schoolMask = spellInfo->GetSchoolMask();
12948 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12949 {
12950 return false;
12951 }
12952
12953 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12954 {
12955 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12956 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12957 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12958 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12959 return true;
12960 }
12961
12962 return false;
12963}

References SpellInfo::CanPierceImmuneAura(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [3/3]

bool Unit::IsImmunedToSchool ( SpellSchoolMask  meleeSchoolMask) const
12927{
12928 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12929 {
12930 return false;
12931 }
12932
12933 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12934 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12935 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12936 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
12937 return true;
12938
12939 return false;
12940}

References IMMUNITY_SCHOOL, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by Spell::DoSpellHitOnUnit(), IsImmunedToDamageOrSchool(), and SpellHitResult().

◆ IsImmunedToSpell()

bool Unit::IsImmunedToSpell ( SpellInfo const *  spellInfo,
Spell const *  spell = nullptr 
)
virtual

Reimplemented in Creature.

13011{
13012 if (!spellInfo)
13013 return false;
13014
13015 // Single spell immunity.
13016 SpellImmuneList const& idList = m_spellImmune[IMMUNITY_ID];
13017 for (SpellImmuneList::const_iterator itr = idList.begin(); itr != idList.end(); ++itr)
13018 if (itr->type == spellInfo->Id)
13019 return true;
13020
13021 // xinef: my special immunity, if spellid is not on this list it means npc is immune
13022 SpellImmuneList const& allowIdList = m_spellImmune[IMMUNITY_ALLOW_ID];
13023 if (!allowIdList.empty())
13024 {
13025 for (SpellImmuneList::const_iterator itr = allowIdList.begin(); itr != allowIdList.end(); ++itr)
13026 if (itr->type == spellInfo->Id)
13027 return false;
13028 return true;
13029 }
13030
13031 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
13032 return false;
13033
13034 if (spellInfo->Dispel)
13035 {
13036 SpellImmuneList const& dispelList = m_spellImmune[IMMUNITY_DISPEL];
13037 for (SpellImmuneList::const_iterator itr = dispelList.begin(); itr != dispelList.end(); ++itr)
13038 if (itr->type == spellInfo->Dispel)
13039 return true;
13040 }
13041
13042 // Spells that don't have effectMechanics.
13043 if (spellInfo->Mechanic)
13044 {
13045 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
13046 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
13047 if (itr->type == spellInfo->Mechanic)
13048 return true;
13049 }
13050
13051 bool immuneToAllEffects = true;
13052 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13053 {
13054 // State/effect immunities applied by aura expect full spell immunity
13055 // Ignore effects with mechanic, they are supposed to be checked separately
13056 if (!spellInfo->Effects[i].IsEffect())
13057 continue;
13058
13059 // Xinef: if target is immune to one effect, and the spell has transform aura - it is immune to whole spell
13060 if (IsImmunedToSpellEffect(spellInfo, i))
13061 {
13062 if (spellInfo->HasAura(SPELL_AURA_TRANSFORM))
13063 return true;
13064 continue;
13065 }
13066
13067 immuneToAllEffects = false;
13068 break;
13069 }
13070 if (immuneToAllEffects) //Return immune only if the target is immune to all spell effects.
13071 return true;
13072
13073 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
13074 {
13075 SpellSchoolMask spellSchoolMask = spellInfo->GetSchoolMask();
13076 if (spell)
13077 {
13078 spellSchoolMask = spell->GetSpellSchoolMask();
13079 }
13080
13081 if (spellSchoolMask != SPELL_SCHOOL_MASK_NONE)
13082 {
13083 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
13084 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
13085 {
13086 SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId);
13087 if (((itr->type & spellSchoolMask) == spellSchoolMask)
13088 && (!immuneSpellInfo || immuneSpellInfo->IsPositive()) && !spellInfo->IsPositive()
13089 && !spellInfo->CanPierceImmuneAura(immuneSpellInfo))
13090 {
13091 return true;
13092 }
13093 }
13094 }
13095 }
13096
13097 return false;
13098}
@ IMMUNITY_ALLOW_ID
Definition: SharedDefines.h:1412
@ IMMUNITY_ID
Definition: SharedDefines.h:1411
@ IMMUNITY_MECHANIC
Definition: SharedDefines.h:1410

References SpellInfo::CanPierceImmuneAura(), SpellInfo::Dispel, SpellInfo::Effects, SpellInfo::GetSchoolMask(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_ALLOW_ID, IMMUNITY_DISPEL, IMMUNITY_ID, IMMUNITY_MECHANIC, IMMUNITY_SCHOOL, IsImmunedToSpellEffect(), SpellInfo::IsPositive(), m_spellImmune, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_TRANSFORM, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

Referenced by AddAura(), Spell::DoSpellHitOnUnit(), Creature::IsImmunedToSpell(), spell_hun_lock_and_load::IsTargetValid(), boss_talon_king_ikiss::JustEngagedWith(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), and SpellHitResult().

◆ IsImmunedToSpellEffect()

bool Unit::IsImmunedToSpellEffect ( SpellInfo const *  spellInfo,
uint32  index 
) const
virtual

Reimplemented in Creature, and Totem.

13101{
13102 if (!spellInfo || !spellInfo->Effects[index].IsEffect())
13103 return false;
13104
13105 // xinef: pet scaling auras
13106 if (spellInfo->HasAttribute(SPELL_ATTR4_OWNER_POWER_SCALING))
13107 return false;
13108
13109 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
13110 return false;
13111
13112 //If m_immuneToEffect type contain this effect type, IMMUNE effect.
13113 uint32 effect = spellInfo->Effects[index].Effect;
13114 SpellImmuneList const& effectList = m_spellImmune[IMMUNITY_EFFECT];
13115 for (SpellImmuneList::const_iterator itr = effectList.begin(); itr != effectList.end(); ++itr)
13116 {
13117 if (itr->type == effect && (itr->spellId != 62692 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13118 {
13119 return true;
13120 }
13121 }
13122
13123 if (uint32 mechanic = spellInfo->Effects[index].Mechanic)
13124 {
13125 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
13126 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
13127 if (itr->type == mechanic)
13128 return true;
13129 }
13130
13131 if (uint32 aura = spellInfo->Effects[index].ApplyAuraName)
13132 {
13134 for (SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
13135 {
13136 if (itr->type == aura && (itr->spellId != 64848 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13137 {
13138 if (!spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
13139 {
13140 if (itr->blockType == SPELL_BLOCK_TYPE_ALL || spellInfo->IsPositive()) // xinef: added for pet scaling
13141 {
13142 return true;
13143 }
13144 }
13145 }
13146 }
13147
13148 if (!spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
13149 {
13150 // Check for immune to application of harmful magical effects
13152 for (AuraEffectList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
13153 {
13154 if (/*(spellInfo->Dispel == DISPEL_MAGIC || spellInfo->Dispel == DISPEL_CURSE || spellInfo->Dispel == DISPEL_DISEASE) &&*/ // Magic debuff, xinef: all kinds?
13155 ((*iter)->GetMiscValue() & spellInfo->GetSchoolMask()) && // Check school
13156 !spellInfo->IsPositiveEffect(index) && // Harmful
13157 spellInfo->Effects[index].Effect != SPELL_EFFECT_PERSISTENT_AREA_AURA) // Not Persistent area auras
13158 {
13159 return true;
13160 }
13161 }
13162 }
13163 }
13164
13165 return false;
13166}
@ SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL
Definition: SpellAuraDefines.h:330
@ SPELL_BLOCK_TYPE_ALL
Definition: SpellDefines.h:159
@ SPELL_EFFECT_PERSISTENT_AREA_AURA
Definition: SharedDefines.h:816
@ SPELL_ATTR3_ALWAYS_HIT
Definition: SharedDefines.h:522
@ IMMUNITY_STATE
Definition: SharedDefines.h:1406
@ IMMUNITY_EFFECT
Definition: SharedDefines.h:1405
@ SPELL_ATTR4_OWNER_POWER_SCALING
Definition: SharedDefines.h:566
bool CanRestoreMana(SpellInfo const *spellInfo) const
Definition: Unit.cpp:21092

References CanRestoreMana(), SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_EFFECT, IMMUNITY_MECHANIC, IMMUNITY_STATE, SpellInfo::IsPositive(), SpellInfo::IsPositiveEffect(), m_spellImmune, POWER_MANA, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_OWNER_POWER_SCALING, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, SPELL_BLOCK_TYPE_ALL, and SPELL_EFFECT_PERSISTENT_AREA_AURA.

Referenced by AddAura(), Spell::AddUnitTarget(), Spell::DoSpellHitOnUnit(), spell_dk_death_grip::HandleBaseDummy(), IsImmunedToSpell(), and Creature::IsImmunedToSpellEffect().

◆ IsImmuneToAll()

bool Unit::IsImmuneToAll ( ) const
inline
872{ return IsImmuneToPC() && IsImmuneToNPC(); }

References IsImmuneToNPC(), and IsImmuneToPC().

◆ IsImmuneToNPC()

◆ IsImmuneToPC()

◆ isInAccessiblePlaceFor()

bool Unit::isInAccessiblePlaceFor ( Creature const *  c) const
4259{
4260 if (c->GetMapId() == MAP_THE_RING_OF_VALOR)
4261 {
4262 // skip transport check, check for being below floor level
4263 if (this->GetPositionZ() < 28.0f)
4264 return false;
4265 if (BattlegroundMap* bgMap = c->GetMap()->ToBattlegroundMap())
4266 if (Battleground* bg = bgMap->GetBG())
4267 if (bg->GetStartTime() < 80133) // 60000ms preparation time + 20133ms elevator rise time
4268 return false;
4269 }
4270 else if (c->GetMapId() == MAP_ICECROWN_CITADEL)
4271 {
4272 // if static transport doesn't match - return false
4273 if (c->GetTransport() != this->GetTransport() && ((c->GetTransport() && c->GetTransport()->IsStaticTransport()) || (this->GetTransport() && this->GetTransport()->IsStaticTransport())))
4274 return false;
4275
4276 // special handling for ICC (map 631), for non-flying pets in Gunship Battle, for trash npcs this is done via CanAIAttack
4277 if (c->GetOwnerGUID().IsPlayer() && !c->CanFly())
4278 {
4279 if (c->GetTransport() != this->GetTransport())
4280 return false;
4281 if (this->GetTransport())
4282 {
4283 if (c->GetPositionY() < 2033.0f)
4284 {
4285 if (this->GetPositionY() > 2033.0f)
4286 return false;
4287 }
4288 else if (c->GetPositionY() < 2438.0f)
4289 {
4290 if (this->GetPositionY() < 2033.0f || this->GetPositionY() > 2438.0f)
4291 return false;
4292 }
4293 else if (this->GetPositionY() < 2438.0f)
4294 return false;
4295 }
4296 }
4297 }
4298 else
4299 {
4300 // pussywizard: prevent any bugs by passengers exiting transports or normal creatures flying away
4301 if (c->GetTransport() != this->GetTransport())
4302 return false;
4303 }
4304
4305 LiquidStatus liquidStatus = GetLiquidData().Status;
4306 bool isInWater = (liquidStatus & MAP_LIQUID_STATUS_IN_CONTACT) != 0;
4307
4308 // In water or jumping in water
4309 if (isInWater || (liquidStatus == LIQUID_MAP_ABOVE_WATER && (IsFalling() || (ToPlayer() && ToPlayer()->IsFalling()))))
4310 {
4311 return c->CanEnterWater();
4312 }
4313 else
4314 {
4315 return c->CanWalk() || c->CanFly();
4316 }
4317}
LiquidStatus
Definition: GridTerrainData.h:190
@ LIQUID_MAP_ABOVE_WATER
Definition: GridTerrainData.h:192
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition: GridTerrainData.h:32
@ MAP_THE_RING_OF_VALOR
Definition: AreaDefines.h:261
@ MAP_ICECROWN_CITADEL
Definition: AreaDefines.h:265
LiquidData const & GetLiquidData() const
Definition: Object.cpp:3071
bool IsFalling() const
Definition: Unit.cpp:19782
LiquidStatus Status
Definition: GridTerrainData.h:206
BattlegroundMap * ToBattlegroundMap()
Definition: Map.h:380
Definition: Map.h:672

References Creature::CanEnterWater(), Creature::CanFly(), Creature::CanWalk(), WorldObject::GetLiquidData(), WorldObject::GetMap(), WorldLocation::GetMapId(), GetOwnerGUID(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransport(), IsFalling(), ObjectGuid::IsPlayer(), GameObject::IsStaticTransport(), LIQUID_MAP_ABOVE_WATER, MAP_ICECROWN_CITADEL, MAP_LIQUID_STATUS_IN_CONTACT, MAP_THE_RING_OF_VALOR, LiquidData::Status, Map::ToBattlegroundMap(), and Object::ToPlayer().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), ChaseMovementGenerator< T >::DoUpdate(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), and HostileReference::updateOnlineStatus().

◆ isInBackInMap()

bool Unit::isInBackInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const

◆ IsInCombat()

bool Unit::IsInCombat ( ) const
inline

References HasUnitFlag(), and UNIT_FLAG_IN_COMBAT.

Referenced by _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), npc_anubisath_sentinel::aqsentinelAI::CallBuddiesToAttack(), npc_argent_captainAI::CanAIAttack(), Player::CanEquipItem(), Creature::CanPeriodicallyCallForAssistance(), Player::CanUnequipItem(), boss_high_nethermancer_zerevor::CastDampenMagicIfPossible(), spell_hun_disengage::CheckCast(), Spell::CheckCast(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CombatStart(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::DoAction(), npc_risen_archmage::npc_risen_archmageAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_felblood_kaelthas::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoAllEffectOnTarget(), UnitAI::DoCastToAllHostilePlayers(), Spell::DoSpellHitOnUnit(), Spell::EffectActivateRune(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), Player::EquipItem(), ResetToHomeOrientation::Execute(), CastRunesEvent::Execute(), GetVelocity(), spell_apothecary_lingering_fumes::HandleAfterCast(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::HandleBattleFieldPortOpcode(), spell_mc_play_dead_aura::HandleEffectRemove(), WorldSession::HandleEquipmentSetUse(), spell_chapter5_return_to_capital::HandleHit(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), spell_putricide_mutated_transformation::HandleSummon(), WorldSession::HandleSummonResponseOpcode(), tele_commandscript::HandleTeleCommand(), misc_commandscript::HandleUnstuckCommand(), WorldSession::HandleUseItemOpcode(), npc_pet_mage_mirror_image::InitializeAI(), IsEngaged(), Creature::IsUpdateNeeded(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_anubrekhan::boss_anubrekhanAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_rotface::boss_rotfaceAI::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), Pet::LoseHappiness(), CreatureGroup::MemberEvaded(), CreatureAI::MoveInLineOfSight(), boss_muru::MoveInLineOfSight(), boss_eye_of_cthun::MoveInLineOfSight(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_alar::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_death_knight_initiate::OnGossipHello(), npc_ulduar_expedition_commander::OnGossipHello(), go_ulduar_working_harpoon::OnGossipHello(), npc_death_knight_initiate::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), BossAI::OnSpellCastFinished(), at_frozen_throne_teleport::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), RisenArchmageCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::OwnerAttackedBy(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), SmartScript::ProcessEvent(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Player::RegenerateHealth(), boss_kiljaeden::Reset(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), instance_naxxramas::SetBossState(), boss_grand_warlock_nethekurse::SetData(), SetInCombatState(), SetSpeed(), boss_prince_keleseth_icc::boss_prince_kelesethAI::SpellHit(), boss_prince_taldaram_icc::boss_prince_taldaramAI::SpellHit(), boss_prince_valanar_icc::boss_prince_valanarAI::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SpellHit(), Spell::SummonGuardian(), lfg::LFGMgr::TeleportPlayer(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Update(), DistractMovementGenerator::Update(), TotemAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_thekal::UpdateAI(), npc_zealot_lorkhan::UpdateAI(), npc_zealot_zath::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), boss_faction_championsAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), PassiveAI::UpdateAI(), PetAI::UpdateAI(), Player::UpdateContestedPvP(), Creature::UpdateEntry(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), InstanceScript::UpdateMinionState(), SmartAI::UpdatePath(), Player::UpdatePotionCooldown(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsInCombatWith()

bool Unit::IsInCombatWith ( Unit const *  who) const
20899{
20900 // Check target exists
20901 if (!who)
20902 return false;
20903 // Search in threat list
20904 ObjectGuid guid = who->GetGUID();
20905 for (ThreatContainer::StorageType::const_iterator i = m_ThreatMgr.GetThreatList().begin(); i != m_ThreatMgr.GetThreatList().end(); ++i)
20906 {
20907 HostileReference* ref = (*i);
20908 // Return true if the unit matches
20909 if (ref && ref->getUnitGuid() == guid)
20910 return true;
20911 }
20912 // Nothing found, false.
20913 return false;
20914}
Definition: ThreatMgr.h:48
ObjectGuid getUnitGuid() const
Definition: ThreatMgr.h:106
ThreatContainer::StorageType const & GetThreatList() const
Definition: ThreatMgr.h:273

References Object::GetGUID(), ThreatMgr::GetThreatList(), HostileReference::getUnitGuid(), and m_ThreatMgr.

Referenced by _IsValidAttackTarget(), DealDamage(), Spell::DoAllEffectOnTarget(), TemporaryThreatModifierEvent::Execute(), IsEngagedBy(), and Acore::NearestAttackableUnitInObjectRangeCheck::operator()().

◆ IsInDisallowedMountForm()

bool Unit::IsInDisallowedMountForm ( ) const
21128{
21129 if (SpellInfo const* transformSpellInfo = sSpellMgr->GetSpellInfo(getTransForm()))
21130 {
21131 if (transformSpellInfo->HasAttribute(SPELL_ATTR0_ALLOW_WHILE_MOUNTED))
21132 {
21133 return false;
21134 }
21135 }
21136
21137 if (ShapeshiftForm form = GetShapeshiftForm())
21138 {
21139 SpellShapeshiftFormEntry const* shapeshift = sSpellShapeshiftFormStore.LookupEntry(form);
21140 if (!shapeshift)
21141 {
21142 return true;
21143 }
21144
21145 if (!(shapeshift->flags1 & SHAPESHIFT_FLAG_STANCE))
21146 {
21147 return true;
21148 }
21149 }
21150
21152 {
21153 return false;
21154 }
21155
21156 CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(GetDisplayId());
21157 if (!display)
21158 {
21159 return true;
21160 }
21161
21163 if (!displayExtra)
21164 {
21165 return true;
21166 }
21167
21168 CreatureModelDataEntry const* model = sCreatureModelDataStore.LookupEntry(display->ModelId);
21169 ChrRacesEntry const* race = sChrRacesStore.LookupEntry(displayExtra->DisplayRaceID);
21170
21171 if (model && !(model->HasFlag(CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT)))
21172 {
21173 if (race && !(race->HasFlag(CHRRACES_FLAGS_CAN_MOUNT)))
21174 {
21175 return true;
21176 }
21177 }
21178
21179 return false;
21180}
@ SHAPESHIFT_FLAG_STANCE
Definition: UnitDefines.h:104
@ SPELL_ATTR0_ALLOW_WHILE_MOUNTED
Definition: SharedDefines.h:417
@ CHRRACES_FLAGS_CAN_MOUNT
Definition: DBCStructure.h:675
@ CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT
Definition: DBCStructure.h:771
uint32 getTransForm() const
Definition: Unit.h:1884
bool HasFlag(ChrRacesFlags flag) const
Definition: DBCStructure.h:700
uint32 ExtendedDisplayInfoID
Definition: DBCStructure.h:725
uint32 DisplayRaceID
Definition: DBCStructure.h:741
bool HasFlag(CreatureModelDataFlags flag) const
Definition: DBCStructure.h:804
uint32 flags1
Definition: DBCStructure.h:1823

References CHRRACES_FLAGS_CAN_MOUNT, CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT, CreatureDisplayInfoExtraEntry::DisplayRaceID, CreatureDisplayInfoEntry::ExtendedDisplayInfoID, SpellShapeshiftFormEntry::flags1, GetDisplayId(), GetNativeDisplayId(), GetShapeshiftForm(), getTransForm(), ChrRacesEntry::HasFlag(), CreatureModelDataEntry::HasFlag(), CreatureDisplayInfoEntry::ModelId, sChrRacesStore, sCreatureDisplayInfoExtraStore, sCreatureDisplayInfoStore, sCreatureModelDataStore, SHAPESHIFT_FLAG_STANCE, SPELL_ATTR0_ALLOW_WHILE_MOUNTED, sSpellMgr, and sSpellShapeshiftFormStore.

Referenced by Player::ActivateTaxiPathTo(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), Spell::CheckCast(), Player::ContinueTaxiFlight(), and Player::ProcessDelayedOperations().

◆ IsInFeralForm()

bool Unit::IsInFeralForm ( ) const
inline

◆ IsInFlight()

bool Unit::IsInFlight ( ) const
inline

◆ isInFrontInMap()

bool Unit::isInFrontInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const
4249{
4250 return IsWithinDistInMap(target, distance) && HasInArc(arc, target);
4251}

References Position::HasInArc(), and WorldObject::IsWithinDistInMap().

◆ IsInnkeeper()

bool Unit::IsInnkeeper ( ) const
inline
@ UNIT_NPC_FLAG_INNKEEPER
Definition: UnitDefines.h:333

References HasNpcFlag(), and UNIT_NPC_FLAG_INNKEEPER.

Referenced by npc_innkeeper::OnGossipHello().

◆ IsInPartyWith()

bool Unit::IsInPartyWith ( Unit const *  unit) const
18872{
18873 if (this == unit)
18874 return true;
18875
18876 Unit const* u1 = GetCharmerOrOwnerOrSelf();
18877 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
18878 if (u1 == u2)
18879 return true;
18880
18881 if (u1->IsPlayer() && u2->IsPlayer())
18882 return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer());
18883 // Xinef: we assume that npcs with the same faction are in party
18884 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
18885 return u1->GetFaction() == u2->GetFaction();
18886 // Xinef: creature type_flag should work for party check only if player group is not a raid
18889 return true;
18890 else
18891 return false;
18892}
bool IsInSameGroupWith(Player const *p) const
Definition: Player.cpp:2322
bool isRaidGroup() const
Definition: Group.cpp:2281

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), Player::GetGroup(), IsControlledByPlayer(), Object::IsCreature(), Player::IsInSameGroupWith(), Object::IsPlayer(), Group::isRaidGroup(), Object::ToCreature(), Object::ToPlayer(), and CreatureTemplate::type_flags.

Referenced by SpellInfo::CheckExplicitTarget(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ IsInRaidWith()

bool Unit::IsInRaidWith ( Unit const *  unit) const
18895{
18896 if (this == unit)
18897 return true;
18898
18899 Unit const* u1 = GetCharmerOrOwnerOrSelf();
18900 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
18901 if (u1 == u2)
18902 return true;
18903
18904 if (u1->IsPlayer() && u2->IsPlayer())
18905 return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer());
18906 // Xinef: we assume that npcs with the same faction are in party
18907 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
18908 return u1->GetFaction() == u2->GetFaction();
18911 return true;
18912 else
18913 return false;
18914}

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), IsControlledByPlayer(), Object::IsCreature(), Player::IsInSameRaidWith(), Object::IsPlayer(), Object::ToCreature(), Object::ToPlayer(), and CreatureTemplate::type_flags.

Referenced by Corpse::BuildValuesUpdate(), SpellInfo::CheckExplicitTarget(), GetReactionTo(), WorldSession::HandleLootMasterGiveOpcode(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), and PatchValuesUpdate().

◆ IsInSanctuary()

bool Unit::IsInSanctuary ( ) const
inline

◆ IsInWater()

bool Unit::IsInWater ( ) const
virtual

Reimplemented in Player.

4405{
4406 return (GetLiquidData().Status & MAP_LIQUID_STATUS_SWIMMING) != 0;
4407}
#define MAP_LIQUID_STATUS_SWIMMING
Definition: GridTerrainData.h:31

References WorldObject::GetLiquidData(), and MAP_LIQUID_STATUS_SWIMMING.

Referenced by Spell::CheckCast(), spell_lurker_below_spout_cone::FilterTargets(), Totem::InitSummon(), and Spell::SelectImplicitCasterDestTargets().

◆ IsLevitating()

◆ IsMounted()

◆ IsMovementPreventedByCasting()

bool Unit::IsMovementPreventedByCasting ( ) const
virtual

Reimplemented in Creature.

4225{
4226 // can always move when not casting
4228 {
4229 return false;
4230 }
4231
4232 // channeled spells during channel stage (after the initial cast timer) allow movement with a specific spell attribute
4234 {
4235 if (spell->getState() != SPELL_STATE_FINISHED && spell->IsChannelActive())
4236 {
4237 if (spell->GetSpellInfo()->IsActionAllowedChannel())
4238 {
4239 return false;
4240 }
4241 }
4242 }
4243
4244 // prohibit movement for all other spell casts
4245 return true;
4246}
@ UNIT_STATE_CASTING
Definition: UnitDefines.h:185

References CURRENT_CHANNELED_SPELL, HasUnitState(), m_currentSpells, SPELL_STATE_FINISHED, and UNIT_STATE_CASTING.

Referenced by TimedFleeingMovementGenerator::Update().

◆ isMoving()

◆ IsNeutralToAll()

bool Unit::IsNeutralToAll ( ) const
10330{
10331 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10332 if (!my_faction || !my_faction->faction)
10333 return true;
10334
10335 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10336 if (raw_faction && raw_faction->reputationListID >= 0)
10337 return false;
10338
10339 return my_faction->IsNeutralToAll();
10340}
bool IsNeutralToAll() const
Definition: DBCStructure.h:982

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsNeutralToAll(), FactionEntry::reputationListID, and sFactionStore.

Referenced by Creature::_IsTargetAcceptable(), Creature::CanStartAttack(), AggressorAI::Permissible(), and ReactorAI::Permissible().

◆ IsNonMeleeSpellCast()

bool Unit::IsNonMeleeSpellCast ( bool  withDelayed,
bool  skipChanneled = false,
bool  skipAutorepeat = false,
bool  isAutoshoot = false,
bool  skipInstant = true 
) const
4156{
4157 // We don't do loop here to explicitly show that melee spell is excluded.
4158 // Maybe later some special spells will be excluded too.
4159
4160 // generic spells are cast when they are not finished and not delayed
4163 (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED))
4164 {
4165 if (!skipInstant || m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime())
4166 {
4167 if (!isAutoshoot || !m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4168 return true;
4169 }
4170 }
4171 // channeled spells may be delayed, but they are still considered cast
4172 if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] &&
4174 {
4175 if (!isAutoshoot || !m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4176 return true;
4177 }
4178 // autorepeat spells may be finished or delayed, but they are still considered cast
4179 if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL])
4180 return true;
4181
4182 return false;
4183}
@ SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS
Definition: SharedDefines.h:484

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, m_currentSpells, SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_DELAYED, and SPELL_STATE_FINISHED.

Referenced by Spell::_cast(), _UpdateAutoRepeatSpell(), Player::ActivateSpec(), Player::ActivateTaxiPathTo(), Player::CanEquipItem(), Player::CanExecutePendingSpellCastRequest(), CombatStop(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), ScriptedAI::DoCastSpell(), Spell::EffectKnockBack(), Spell::finish(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), isSpellBlocked(), boss_shade_of_aran::JustEngagedWith(), boss_pandemonius::JustEngagedWith(), MeleeSpellHitResult(), Spell::prepare(), SmartScript::ProcessEvent(), RollMeleeOutcomeAgainst(), spell_item_fetch_ball::SelectTarget(), setDeathState(), StopAttackFaction(), boss_netherspite::SwitchToPortalPhase(), Player::TeleportTo(), TotemAI::UpdateAI(), npc_chesspiece::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_warmage_violetstand::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ IsOnVehicle()

◆ IsPet()

bool Unit::IsPet ( ) const
inline
749{ return m_unitTypeMask & UNIT_MASK_PET; }
@ UNIT_MASK_PET
Definition: UnitDefines.h:160

References m_unitTypeMask, and UNIT_MASK_PET.

Referenced by Spell::_cast(), Spell::AddUnitTarget(), spell_warl_demonic_pact_aura::AfterCheckProc(), Creature::AllLootRemovedFromCorpse(), BeforeVisibilityDestroy< Creature >(), Creature::CallAssistance(), Creature::CallForHelp(), boss_renataki::boss_renatakiAI::CanAlwaysBeDetectable(), boss_renataki::boss_renatakiAI::CanSeeAlways(), Creature::CanSwim(), ClearInCombat(), CombatStart(), Creature::CreateFromProto(), Player::CreatePet(), DealDamage(), MotionTransport::DelayedTeleportTransport(), PetAI::DoAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectDismissPet(), Spell::EffectForceDeselect(), Spell::EffectRenamePet(), Spell::EffectSanctuary(), Spell::EffectSchoolDMG(), Spell::EffectTameCreature(), Acore::XP::Gain(), Creature::GetAggroRange(), GetCastingTimeForBonus(), GetCombatRatingReduction(), GetCreatePowers(), GetNextRandomRaidMemberOrPet(), GetRandomContactPoint(), GetVelocity(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModStat(), debug_commandscript::HandleDebugThreatListCommand(), AuraEffect::HandleFeignDeath(), modify_commandscript::HandleModifyTalentCommand(), AuraEffect::HandleModPossessPet(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcDeleteCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_commandscript::HandleNpcSetModelCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), npc_commandscript::HandleNpcTameCommand(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), pet_commandscript::HandlePetCreateCommand(), WorldSession::HandlePetRename(), WorldSession::HandlePetSetAction(), misc_commandscript::HandleRespawnCommand(), Creature::InitEntry(), TempSummon::InitStats(), Guardian::InitStatsForLevel(), DisableMgr::IsDisabledFor(), Creature::isElite(), Minion::IsGuardianPet(), Player::isHonorOrXPTarget(), Creature::isWorldBoss(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_underbat::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_murmur::JustEngagedWith(), Kill(), spell_hun_target_self_and_pet::Load(), ModSpellCastTime(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::MoveInLineOfSight(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::MoveInLineOfSight(), Acore::MostHPMissingGroupInRange::operator()(), PetAI::ReceiveEmote(), RollMeleeOutcomeAgainst(), FactorySelector::SelectAI(), Creature::SelectLevel(), WorldSession::SendPetNameQuery(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetCharm(), Creature::SetDisplayId(), SetHealth(), SetInCombatState(), SetMinion(), Creature::SetObjectScale(), setPowerType(), SpellDamageBonusDone(), SpellPctDamageModsDone(), ToPet(), TempSummon::UnSummon(), Update(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_hazzarah::UpdateAI(), PetAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdateAuraForGroup(), Creature::UpdateEntry(), Creature::UpdateMoveInLineOfSightState(), and UpdateSpeed().

◆ IsPetAura()

bool Unit::IsPetAura ( Aura const *  aura)
17420{
17421 Unit* owner = GetOwner();
17422
17423 if (!owner || !owner->IsPlayer())
17424 return false;
17425
17426 // if the owner has that pet aura, return true
17427 for (PetAura const* petAura : owner->m_petAuras)
17428 if (petAura->GetAura(GetEntry()) == aura->GetId())
17429 return true;
17430
17431 return false;
17432}
Definition: SpellMgr.h:470
uint32 GetAura(uint32 petEntry) const
Definition: SpellMgr.h:486

References PetAura::GetAura(), Object::GetEntry(), Aura::GetId(), GetOwner(), Object::IsPlayer(), and m_petAuras.

Referenced by Pet::_SaveAuras(), and Spell::EffectSummonPet().

◆ IsPetInCombat()

bool Unit::IsPetInCombat ( ) const
inline

◆ IsPolymorphed()

bool Unit::IsPolymorphed ( ) const
16825{
16826 uint32 transformId = getTransForm();
16827 if (!transformId)
16828 return false;
16829
16830 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(transformId);
16831 if (!spellInfo)
16832 return false;
16833
16834 return spellInfo->GetSpellSpecific() == SPELL_SPECIFIC_MAGE_POLYMORPH;
16835}
@ SPELL_SPECIFIC_MAGE_POLYMORPH
Definition: SpellInfo.h:160
SpellSpecificType GetSpellSpecific() const
Definition: SpellInfo.cpp:2149

References SpellInfo::GetSpellSpecific(), getTransForm(), SPELL_SPECIFIC_MAGE_POLYMORPH, and sSpellMgr.

Referenced by Attack(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), and Creature::Update().

◆ isPossessed()

◆ isPossessedByPlayer()

bool Unit::isPossessedByPlayer ( ) const
inline

◆ isPossessing() [1/2]

bool Unit::isPossessing ( ) const
inline
1243 {
1244 if (Unit* u = GetCharm())
1245 return u->isPossessed();
1246 else
1247 return false;
1248 }

References GetCharm().

Referenced by WorldSession::HandleCastSpellOpcode(), and misc_commandscript::HandleUnbindSightCommand().

◆ isPossessing() [2/2]

bool Unit::isPossessing ( Unit u) const
inline
1249{ return u->isPossessed() && GetCharmGUID() == u->GetGUID(); }
bool isPossessed() const
Definition: Unit.h:1240

References GetCharmGUID(), Object::GetGUID(), and isPossessed().

◆ IsPvP()

◆ IsQuestGiver()

bool Unit::IsQuestGiver ( ) const
inline
@ UNIT_NPC_FLAG_QUESTGIVER
Definition: UnitDefines.h:318

References HasNpcFlag(), and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_lokhtos_darkbargainer::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_cos_chromie_middle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_fos_leader::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_queue::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_taxi::OnGossipHello(), npc_riggle_bassbait::OnGossipHello(), and npc_sayge::OnGossipHello().

◆ IsScriptOverriden()

AuraEffect * Unit::IsScriptOverriden ( SpellInfo const *  spell,
int32  script 
) const
5898{
5900 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5901 {
5902 if ((*i)->GetMiscValue() == script)
5903 if ((*i)->IsAffectedOnSpell(spell))
5904 return (*i);
5905 }
5906 return nullptr;
5907}
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
Definition: SpellAuraDefines.h:175

References GetAuraEffectsByType(), and SPELL_AURA_OVERRIDE_CLASS_SCRIPTS.

Referenced by Spell::CheckCast(), Spell::EffectWeaponDmg(), and AuraEffect::HandleAuraModShapeshift().

◆ IsServiceProvider()

bool Unit::IsServiceProvider ( ) const
inline

◆ IsSitState()

bool Unit::IsSitState ( ) const
16795{
16796 uint8 s = getStandState();
16797 return
16801}
@ UNIT_STAND_STATE_SIT_HIGH_CHAIR
Definition: UnitDefines.h:38
@ UNIT_STAND_STATE_SIT_MEDIUM_CHAIR
Definition: UnitDefines.h:37
@ UNIT_STAND_STATE_SIT_LOW_CHAIR
Definition: UnitDefines.h:36
@ UNIT_STAND_STATE_SIT_CHAIR
Definition: UnitDefines.h:34

References getStandState(), UNIT_STAND_STATE_SIT, UNIT_STAND_STATE_SIT_CHAIR, UNIT_STAND_STATE_SIT_HIGH_CHAIR, UNIT_STAND_STATE_SIT_LOW_CHAIR, and UNIT_STAND_STATE_SIT_MEDIUM_CHAIR.

Referenced by _ApplyAura(), AttackerStateUpdate(), WorldSession::HandleMovementOpcodes(), IsStandState(), Spell::prepare(), and SpellTakenCritChance().

◆ isSpellBlocked()

bool Unit::isSpellBlocked ( Unit victim,
SpellInfo const *  spellProto,
WeaponAttackType  attackType = BASE_ATTACK 
)
3135{
3136 // These spells can't be blocked
3137 if (spellProto && spellProto->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3138 return false;
3139
3140 if (victim->HasIgnoreHitDirectionAura() || victim->HasInArc(M_PI, this))
3141 {
3142 // Check creatures flags_extra for disable block
3143 if (victim->IsCreature() &&
3145 return false;
3146
3147 float blockChance = victim->GetUnitBlockChance();
3148 blockChance += (int32(GetWeaponSkillValue(attackType)) - int32(victim->GetMaxSkillValueForLevel())) * 0.04f;
3149
3150 // xinef: cant block while casting or while stunned
3151 if (blockChance < 0.0f || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3152 blockChance = 0.0f;
3153
3154 if (roll_chance_f(blockChance))
3155 return true;
3156 }
3157 return false;
3158}
@ UNIT_STATE_CONTROLLED
Definition: UnitDefines.h:213
@ CREATURE_FLAG_EXTRA_NO_BLOCK
Definition: CreatureData.h:49
@ SPELL_ATTR0_NO_ACTIVE_DEFENSE
Definition: SharedDefines.h:414
bool HasIgnoreHitDirectionAura() const
Definition: Unit.h:1729
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition: Unit.cpp:3824
float GetUnitBlockChance() const
Definition: Unit.cpp:3736

References CREATURE_FLAG_EXTRA_NO_BLOCK, GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), Creature::HasFlagsExtra(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), Object::IsCreature(), IsNonMeleeSpellCast(), roll_chance_f(), SPELL_ATTR0_NO_ACTIVE_DEFENSE, Object::ToCreature(), and UNIT_STATE_CONTROLLED.

Referenced by CalculateSpellDamageTaken().

◆ IsSpiritGuide()

bool Unit::IsSpiritGuide ( ) const
inline

◆ IsSpiritHealer()

bool Unit::IsSpiritHealer ( ) const
inline

◆ IsSpiritService()

◆ IsStandState()

◆ IsStopped()

bool Unit::IsStopped ( ) const
inline

◆ IsSummon()

bool Unit::IsSummon ( ) const
inline
@ UNIT_MASK_SUMMON
Definition: UnitDefines.h:156

References m_unitTypeMask, and UNIT_MASK_SUMMON.

Referenced by Creature::CanPeriodicallyCallForAssistance(), spell_item_unsated_craving::CheckProc(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Spell::EffectScriptEffect(), boss_skeram::EnterEvadeMode(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), Spell::finish(), GetAllMinionsByEntry(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pri_lightwell::HandleScriptEffect(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), boss_skeram::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::JustDied(), boss_skeram::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), BattlefieldWG::OnCreatureCreate(), InstanceScript::OnCreatureCreate(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnCreatureCreate(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnUnitDeath(), RemoveAllControlled(), RemoveAllMinionsByEntry(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), Creature::SaveRespawnTime(), Creature::SearchFormation(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), ToTempSummon(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_skeram::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), and Player::VehicleSpellInitialize().

◆ isSwimming()

◆ IsTabardDesigner()

bool Unit::IsTabardDesigner ( ) const
inline

◆ isTargetableForAttack()

◆ IsTaxi()

bool Unit::IsTaxi ( ) const
inline

◆ IsTotem()

◆ IsTrainer()

◆ IsTriggeredAtSpellProcEvent()

bool Unit::IsTriggeredAtSpellProcEvent ( Unit victim,
Aura aura,
WeaponAttackType  attType,
bool  isVictim,
bool  active,
SpellProcEventEntry const *&  spellProcEvent,
ProcEventInfo const &  eventInfo 
)
private
17507{
17508 SpellInfo const* spellProto = aura->GetSpellInfo();
17509 SpellInfo const* procSpell = eventInfo.GetSpellInfo();
17510
17511 // let the aura be handled by new proc system if it has new entry
17512 if (sSpellMgr->GetSpellProcEntry(spellProto->Id))
17513 return false;
17514
17515 // Get proc Event Entry
17516 spellProcEvent = sSpellMgr->GetSpellProcEvent(spellProto->Id);
17517
17518 // Get EventProcFlag
17519 uint32 EventProcFlag;
17520 if (spellProcEvent && spellProcEvent->procFlags) // if exist get custom spellProcEvent->procFlags
17521 EventProcFlag = spellProcEvent->procFlags;
17522 else
17523 EventProcFlag = spellProto->ProcFlags; // else get from spell proto
17524 // Continue if no trigger exist
17525 if (!EventProcFlag)
17526 return false;
17527
17528 // Additional checks for triggered spells (ignore trap casts)
17529 if (eventInfo.GetHitMask() & PROC_EX_INTERNAL_TRIGGERED && !(EventProcFlag & PROC_FLAG_DONE_TRAP_ACTIVATION))
17530 {
17532 return false;
17533 }
17534
17535 // Xinef: additional check for player auras - only player spells can trigger player proc auras
17536 // Xinef: skip victim auras
17537 // Excluded player shoot spells
17538 // Excluded player item spells
17539 if (!isVictim && IsPlayer() && !(EventProcFlag & (PROC_FLAG_KILL | PROC_FLAG_DEATH)))
17540 {
17541 if (procSpell && procSpell->SpellFamilyName == SPELLFAMILY_GENERIC && procSpell->GetCategory() != 76 &&
17542 (!eventInfo.GetProcSpell() || !eventInfo.GetProcSpell()->m_CastItem) &&
17543 (!eventInfo.GetTriggerAuraSpell() || eventInfo.GetTriggerAuraSpell()->SpellFamilyName == SPELLFAMILY_GENERIC))
17544 {
17545 return false;
17546 }
17547 }
17548
17549 // Check spellProcEvent data requirements
17550 if (!sSpellMgr->IsSpellProcEventCanTriggeredBy(spellProto, spellProcEvent, EventProcFlag, eventInfo, active))
17551 return false;
17552 // In most cases req get honor or XP from kill
17553 if (EventProcFlag & PROC_FLAG_KILL && IsPlayer())
17554 {
17555 bool allow = false;
17556
17557 if (victim)
17558 allow = ToPlayer()->isHonorOrXPTarget(victim);
17559
17560 // Shadow Word: Death - can trigger from every kill
17561 if (aura->GetId() == 32409 || aura->GetId() == 18372 || aura->GetId() == 18213)
17562 allow = true;
17563 if (!allow)
17564 return false;
17565 }
17566 // Aura added by spell can`t trigger from self (prevent drop charges/do triggers)
17567 // But except periodic and kill triggers (can triggered from self)
17568 if (procSpell && procSpell->Id == spellProto->Id
17569 && !(spellProto->ProcFlags & (PROC_FLAG_TAKEN_PERIODIC | PROC_FLAG_KILL)))
17570 return false;
17571
17572 // Check if current equipment allows aura to proc
17573 if (!isVictim && IsPlayer() && !spellProto->HasAttribute(SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT))
17574 {
17575 Player* player = ToPlayer();
17576 if (spellProto->EquippedItemClass == ITEM_CLASS_WEAPON)
17577 {
17578 Item* item = nullptr;
17579 if (attType == BASE_ATTACK)
17581 else if (attType == OFF_ATTACK)
17583 else
17585
17586 if (player->IsInFeralForm())
17587 return false;
17588
17589 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_WEAPON || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17590 return false;
17591 }
17592 else if (spellProto->EquippedItemClass == ITEM_CLASS_ARMOR)
17593 {
17594 // Check if player is wearing shield
17596 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_ARMOR || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17597 return false;
17598 }
17599 }
17600 // Get chance from spell
17601 float chance = float(spellProto->ProcChance);
17602 // If in spellProcEvent exist custom chance, chance = spellProcEvent->customChance;
17603 if (spellProcEvent && spellProcEvent->customChance)
17604 chance = spellProcEvent->customChance;
17605 // If PPM exist calculate chance from PPM
17606 if (spellProcEvent && spellProcEvent->ppmRate != 0)
17607 {
17608 uint32 attackSpeed = 0;
17609 Unit* attacker = nullptr;
17610 if (!isVictim)
17611 attacker = this;
17612 else if (victim)
17613 attacker = victim;
17614
17615 if (attacker)
17616 {
17617 if (!procSpell || procSpell->DmgClass == SPELL_DAMAGE_CLASS_MELEE || procSpell->IsRangedWeaponSpell())
17618 {
17619 attackSpeed = attacker->GetAttackTime(attType);
17620 }
17621 else //spells user their casttime for ppm calculations
17622 {
17623 if (procSpell->CastTimeEntry)
17624 attackSpeed = procSpell->CastTimeEntry->CastTime;
17625
17626 //instants and fast spells use 1.5s castspeed
17627 if (attackSpeed < 1500)
17628 attackSpeed = 1500;
17629 }
17630 }
17631 chance = GetPPMProcChance(attackSpeed, spellProcEvent->ppmRate, spellProto);
17632 }
17633
17634 // Custom chances
17635 switch (spellProto->SpellFamilyName)
17636 {
17638 {
17639 // Recklessness, allow to proc only once for whirlwind
17640 if (spellProto->Id == 1719 && procSpell && procSpell->Id == 44949)
17641 return false;
17642 }
17643 }
17644
17645 if (eventInfo.GetProcChance())
17646 {
17647 chance = *eventInfo.GetProcChance();
17648 }
17649
17650 // Apply chance modifer aura
17651 if (Player* modOwner = GetSpellModOwner())
17652 {
17653 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CHANCE_OF_SUCCESS, chance);
17654 }
17655
17656 return roll_chance_f(chance);
17657}
@ PROC_EX_INTERNAL_TRIGGERED
Definition: SpellMgr.h:221
@ PROC_FLAG_DEATH
Definition: SpellMgr.h:143
@ PROC_FLAG_TAKEN_PERIODIC
Definition: SpellMgr.h:135
@ PROC_FLAG_KILL
Definition: SpellMgr.h:108
@ PROC_FLAG_DONE_TRAP_ACTIVATION
Definition: SpellMgr.h:138
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition: SpellDefines.h:94
@ ITEM_CLASS_ARMOR
Definition: ItemTemplate.h:295
@ ITEM_CLASS_WEAPON
Definition: ItemTemplate.h:293
@ EQUIPMENT_SLOT_RANGED
Definition: Player.h:688
@ SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT
Definition: SharedDefines.h:505
@ SPELL_ATTR3_CAN_PROC_FROM_PROCS
Definition: SharedDefines.h:530
uint32 Class
Definition: ItemTemplate.h:621
uint32 SubClass
Definition: ItemTemplate.h:622
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition: Player.h:1250
bool isHonorOrXPTarget(Unit *victim) const
Definition: Player.cpp:12696
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition: Unit.cpp:13545
uint32 GetCategory() const
Definition: SpellInfo.cpp:871
int32 EquippedItemClass
Definition: SpellInfo.h:375
uint32 ProcFlags
Definition: SpellInfo.h:355
int32 EquippedItemSubClassMask
Definition: SpellInfo.h:376
SpellCastTimesEntry const * CastTimeEntry
Definition: SpellInfo.h:347
uint32 DmgClass
Definition: SpellInfo.h:389
bool IsRangedWeaponSpell() const
Definition: SpellInfo.cpp:1276
int32 CastTime
Definition: DBCStructure.h:1761

References BASE_ATTACK, SpellCastTimesEntry::CastTime, SpellInfo::CastTimeEntry, ItemTemplate::Class, SpellProcEventEntry::customChance, SpellInfo::DmgClass, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, SpellInfo::EquippedItemClass, SpellInfo::EquippedItemSubClassMask, GetAttackTime(), SpellInfo::GetCategory(), ProcEventInfo::GetHitMask(), Aura::GetId(), GetPPMProcChance(), ProcEventInfo::GetProcChance(), ProcEventInfo::GetProcSpell(), ProcEventInfo::GetSpellInfo(), Aura::GetSpellInfo(), GetSpellModOwner(), Item::GetTemplate(), ProcEventInfo::GetTriggerAuraSpell(), Player::GetUseableItemByPos(), SpellInfo::HasAttribute(), SpellInfo::Id, INVENTORY_SLOT_BAG_0, Item::IsBroken(), Player::isHonorOrXPTarget(), IsInFeralForm(), Object::IsPlayer(), SpellInfo::IsRangedWeaponSpell(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, Spell::m_CastItem, OFF_ATTACK, SpellProcEventEntry::ppmRate, PROC_EX_INTERNAL_TRIGGERED, PROC_FLAG_DEATH, PROC_FLAG_DONE_TRAP_ACTIVATION, PROC_FLAG_KILL, PROC_FLAG_TAKEN_PERIODIC, SpellInfo::ProcChance, SpellInfo::ProcFlags, SpellProcEventEntry::procFlags, roll_chance_f(), SPELL_ATTR3_CAN_PROC_FROM_PROCS, SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT, SPELL_DAMAGE_CLASS_MELEE, SPELLFAMILY_GENERIC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyName, SPELLMOD_CHANCE_OF_SUCCESS, sSpellMgr, ItemTemplate::SubClass, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ isTurning()

bool Unit::isTurning ( ) const
inline

◆ IsUnderLastManaUseEffect()

bool Unit::IsUnderLastManaUseEffect ( ) const

◆ IsUnderWater()

bool Unit::IsUnderWater ( ) const
virtual
4410{
4412}
@ LIQUID_MAP_UNDER_WATER
Definition: GridTerrainData.h:195

References WorldObject::GetLiquidData(), LIQUID_MAP_UNDER_WATER, and LiquidData::Status.

Referenced by Creature::setDeathState().

◆ IsValidAssistTarget()

bool Unit::IsValidAssistTarget ( Unit const *  target) const
14096{
14097 return _IsValidAssistTarget(target, nullptr);
14098}
bool _IsValidAssistTarget(Unit const *target, SpellInfo const *bySpell) const
Definition: Unit.cpp:14101

References _IsValidAssistTarget().

Referenced by SmartAI::AssistPlayerInCombatAgainst().

◆ IsValidAttackTarget()

bool Unit::IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell = nullptr 
) const
13973{
13974 return _IsValidAttackTarget(target, bySpell);
13975}

References _IsValidAttackTarget().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), CreatureGroup::GetNewTargetForMember(), WorldSession::HandleAttackSwingOpcode(), npc_pet_dk_army_of_the_dead::IsSummonedBy(), npc_beryl_sorcerer::npc_beryl_sorcererAI::JustEngagedWith(), CreatureGroup::MemberEngagingTarget(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), boss_kaelthas::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestHostileUnitCheck::operator()(), MalleableGooSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), CreatureAI::SetGazeOn(), StopAttackingInvalidTarget(), SimpleCharmedAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateCharmedAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ IsVehicle()

bool Unit::IsVehicle ( ) const
inline

References m_unitTypeMask, and UNIT_MASK_VEHICLE.

Referenced by Battleground::AddCreature(), Creature::AddToWorld(), ApplyResilience(), CanHaveThreatList(), spell_wintergrasp_water::CheckCast(), Spell::CheckEffectTarget(), SpellInfo::CheckTarget(), Map::CreatureRelocation(), DealDamage(), DealMeleeDamage(), MotionTransport::DelayedTeleportTransport(), Spell::EffectDummy(), Spell::EffectKnockBack(), Spell::EffectSummonType(), CreatureAI::EnterEvadeMode(), SmartScript::GetTargets(), GetVelocity(), AuraEffect::HandleAuraControlVehicle(), debug_commandscript::HandleDebugEnterVehicleCommand(), debug_commandscript::HandleDebugSetVehicleIdCommand(), spell_q13280_13283_plant_battle_standard::HandleDummy(), BattlefieldWG::HandleKill(), BattlegroundIC::HandleKillUnit(), WorldSession::HandlePetActionHelper(), spell_q12919_gymers_throw::HandleScript(), spell_putricide_mutated_transformation::HandleSummon(), TempSummon::InitStats(), KillRewarder::KillRewarder(), spell_igb_overheat_aura::Load(), MagicSpellHitResult(), npc_brann_radio::npc_brann_radioAI::MoveInLineOfSight(), BattlefieldWG::OnUnitDeath(), OutDebugInfo(), VehicleAI::Permissible(), Map::PlayerRelocation(), SmartScript::ProcessAction(), RemoveCharmedBy(), RemoveFromWorld(), Spell::SelectImplicitCasterObjectTargets(), SetCharmedBy(), SetOwnerGUID(), SetSpeed(), Player::StopCastingCharm(), Map::SummonCreature(), UpdateCharmAI(), Creature::UpdateEntry(), UpdateHeight(), UpdateOrientation(), and UpdateSpeed().

◆ IsVendor()

◆ IsVisible()

bool Unit::IsVisible ( ) const
inline
@ SERVERSIDE_VISIBILITY_GM
Definition: SharedDefines.h:1284
@ SEC_PLAYER
Definition: Common.h:57
T_VALUES GetValue(FLAG_TYPE flag) const
Definition: Object.h:394

References FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::GetValue(), WorldObject::m_serverSideVisibility, SEC_PLAYER, and SERVERSIDE_VISIBILITY_GM.

Referenced by npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::CanAIAttack(), boss_professor_putricide::boss_professor_putricideAI::CanAIAttack(), boss_sindragosa::boss_sindragosaAI::CanAIAttack(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), SpellInfo::CheckTarget(), AuraEffect::HandlePhase(), Player::IsVisibleGloballyFor(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), Acore::AllFriendlyCreaturesInGrid::operator()(), boss_sapphiron::boss_sapphironAI::Reset(), npc_pos_leader::npc_pos_leaderAI::SetData(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), and boss_vazruden_the_herald::UpdateAI().

◆ IsWalking()

◆ IsWithinBoundaryRadius()

bool Unit::IsWithinBoundaryRadius ( const Unit obj) const
706{
707 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
708 return false;
709
710 float objBoundaryRadius = std::max(obj->GetBoundaryRadius(), MIN_MELEE_REACH);
711
712 return IsInDist(obj, objBoundaryRadius);
713}
bool IsInDist(float x, float y, float z, float dist) const
Definition: Position.h:221
float GetBoundaryRadius() const
Definition: Unit.h:823

References GetBoundaryRadius(), WorldObject::InSamePhase(), Position::IsInDist(), WorldObject::IsInMap(), and MIN_MELEE_REACH.

Referenced by Spell::CheckRange(), Acore::WorldObjectSpellConeTargetCheck::operator()(), and Player::Update().

◆ IsWithinCombatRange()

bool Unit::IsWithinCombatRange ( Unit const *  obj,
float  dist2compare 
) const

◆ IsWithinMeleeRange()

bool Unit::IsWithinMeleeRange ( Unit const *  obj,
float  dist = 0.f 
) const
667{
668 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
669 return false;
670
671 float dx = GetPositionX() - obj->GetPositionX();
672 float dy = GetPositionY() - obj->GetPositionY();
673 float dz = GetPositionZ() - obj->GetPositionZ();
674 float distsq = dx * dx + dy * dy + dz * dz;
675
676 float maxdist = dist + GetMeleeRange(obj);
677
678 if ((IsPlayer() || obj->IsPlayer()) && HasLeewayMovement() && obj->HasLeewayMovement())
679 maxdist += LEEWAY_BONUS_RANGE;
680
681 return distsq < maxdist * maxdist;
682}
#define LEEWAY_BONUS_RANGE
Definition: ObjectDefines.h:51
bool HasLeewayMovement() const
Definition: Unit.h:1645

References GetMeleeRange(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), HasLeewayMovement(), WorldObject::InSamePhase(), WorldObject::IsInMap(), Object::IsPlayer(), and LEEWAY_BONUS_RANGE.

Referenced by boss_marli::_chargePlayer(), boss_swamplord_muselek::AttackStart(), SmartAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::CanAIAttack(), boss_ouro::CanAIAttack(), boss_murmur::CanAIAttack(), boss_alar::CanAIAttack(), PetAI::CanAttack(), Spell::CheckRange(), SmartAI::DistanceYourself(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), ChaseMovementGenerator< T >::DoUpdate(), spell_shazzrah_gate_dummy::FilterTargets(), boss_supremus::FindHatefulStrikeTarget(), boss_ouro::IsPlayerWithinMeleeRange(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), boss_swamplord_muselek::JustEngagedWith(), boss_vem::JustEngagedWith(), CreatureAI::MoveCircleChecks(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), SpellTargetSelector::operator()(), MysticBuffetTargetFilter::operator()(), SmartScript::ProcessEvent(), ThreatContainer::SelectNextVictim(), boss_murmur::ShouldCastResonance(), boss_quartermaster_zigris::SpellHitTarget(), Player::Update(), boss_quartermaster_zigris::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_skeram::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), PetAI::UpdateAI(), npc_dark_fiend::UpdateAI(), npc_zuljin_vortex::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), and boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI().

◆ IsWithinRange()

bool Unit::IsWithinRange ( Unit const *  obj,
float  dist 
) const
691{
692 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
693 {
694 return false;
695 }
696
697 auto dx = GetPositionX() - obj->GetPositionX();
698 auto dy = GetPositionY() - obj->GetPositionY();
699 auto dz = GetPositionZ() - obj->GetPositionZ();
700 auto distsq = dx * dx + dy * dy + dz * dz;
701
702 return distsq <= dist * dist;
703}

References Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by boss_swamplord_muselek::CanShootVictim(), npc_sunblade_scout::JustEngagedWith(), and npc_amanishi_scout::JustEngagedWith().

◆ JumpTo() [1/2]

void Unit::JumpTo ( float  speedXY,
float  speedZ,
bool  forward = true 
)
19355{
19356 float angle = forward ? 0 : M_PI;
19357 if (IsCreature())
19358 GetMotionMaster()->MoveJumpTo(angle, speedXY, speedZ);
19359 else
19360 {
19361 float vcos = cos(angle + GetOrientation());
19362 float vsin = std::sin(angle + GetOrientation());
19363
19364 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19365 data << GetPackGUID();
19366 data << uint32(0); // Sequence
19367 data << float(vcos); // x direction
19368 data << float(vsin); // y direction
19369 data << float(speedXY); // Horizontal speed
19370 data << float(-speedZ); // Z Movement speed (vertical)
19371
19372 ToPlayer()->GetSession()->SendPacket(&data);
19373 }
19374}
@ SMSG_MOVE_KNOCK_BACK
Definition: Opcodes.h:269
WorldSession * GetSession() const
Definition: Player.h:1998
void MoveJumpTo(float angle, float speedXY, float speedZ)
The unit will jump in a specific direction.
Definition: MotionMaster.cpp:622
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition: WorldSession.cpp:251

References GetMotionMaster(), Position::GetOrientation(), Object::GetPackGUID(), Player::GetSession(), Object::IsCreature(), MotionMaster::MoveJumpTo(), WorldSession::SendPacket(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by Spell::EffectLeapBack().

◆ JumpTo() [2/2]

void Unit::JumpTo ( WorldObject obj,
float  speedZ 
)
19377{
19378 float x, y, z;
19379 obj->GetContactPoint(this, x, y, z);
19380 float speedXY = GetExactDist2d(x, y) * 10.0f / speedZ;
19381 GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ);
19382}
void GetContactPoint(WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
Definition: Object.cpp:2735
void MoveJump(Position const &pos, float speedXY, float speedZ, uint32 id=0)
Definition: MotionMaster.h:229

References WorldObject::GetContactPoint(), Position::GetExactDist2d(), GetMotionMaster(), and MotionMaster::MoveJump().

◆ Kill()

void Unit::Kill ( Unit killer,
Unit victim,
bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
static
Todo:
: do instance binding anyway if the charmer/owner is offline
17800{
17801 // Prevent killing unit twice (and giving reward from kill twice)
17802 if (!victim->GetHealth())
17803 return;
17804
17805 if (killer && !killer->IsInMap(victim))
17806 killer = nullptr;
17807
17808 // find player: owner of controlled `this` or `this` itself maybe
17809 Player* player = killer ? killer->GetCharmerOrOwnerPlayerOrPlayerItself() : nullptr;
17810 Creature* creature = victim->ToCreature();
17811
17812 bool isRewardAllowed = true;
17813 if (creature)
17814 {
17815 isRewardAllowed = (creature->IsDamageEnoughForLootingAndReward() && !creature->IsLootRewardDisabled());
17816 if (!isRewardAllowed)
17817 creature->SetLootRecipient(nullptr);
17818 }
17819
17820 // pussywizard: remade this if section (player is on the same map
17821 if (isRewardAllowed && creature)
17822 {
17823 Player* lr = creature->GetLootRecipient();
17824 if (lr && lr->IsInMap(creature))
17825 player = creature->GetLootRecipient();
17826 else if (Group* lrg = creature->GetLootRecipientGroup())
17827 for (GroupReference* itr = lrg->GetFirstMember(); itr != nullptr; itr = itr->next())
17828 if (Player* member = itr->GetSource())
17829 if (member->IsAtLootRewardDistance(creature))
17830 {
17831 player = member;
17832 break;
17833 }
17834 }
17835
17836 // Exploit fix
17837 if (creature && creature->IsPet() && creature->GetOwnerGUID().IsPlayer())
17838 isRewardAllowed = false;
17839
17840 // Reward player, his pets, and group/raid members
17841 // call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop)
17842 if (isRewardAllowed && player && player != victim)
17843 {
17844 WorldPacket data(SMSG_PARTYKILLLOG, (8 + 8)); // send event PARTY_KILL
17845 data << player->GetGUID(); // player with killing blow
17846 data << victim->GetGUID(); // victim
17847
17848 Player* looter = player;
17849 Group* group = player->GetGroup();
17850 bool hasLooterGuid = false;
17851
17852 if (group)
17853 {
17854 group->BroadcastPacket(&data, group->GetMemberGroup(player->GetGUID()));
17855
17856 if (creature)
17857 {
17858 group->UpdateLooterGuid(creature, true);
17859 if (group->GetLooterGuid() && group->GetLootMethod() != FREE_FOR_ALL)
17860 {
17861 looter = ObjectAccessor::FindPlayer(group->GetLooterGuid());
17862 if (looter)
17863 {
17864 hasLooterGuid = true;
17865 creature->SetLootRecipient(looter); // update creature loot recipient to the allowed looter.
17866 }
17867 }
17868 }
17869 }
17870 else
17871 {
17872 player->SendDirectMessage(&data);
17873
17874 if (creature)
17875 {
17876 WorldPacket data2(SMSG_LOOT_LIST, 8 + 1 + 1);
17877 data2 << creature->GetGUID();
17878 data2 << uint8(0); // unk1
17879 data2 << uint8(0); // no group looter
17880 player->SendMessageToSet(&data2, true);
17881 }
17882 }
17883
17884 // Generate loot before updating looter
17885 if (creature)
17886 {
17887 Loot* loot = &creature->loot;
17888 loot->clear();
17889
17890 if (uint32 lootid = creature->GetCreatureTemplate()->lootid)
17891 loot->FillLoot(lootid, LootTemplates_Creature, looter, false, false, creature->GetLootMode(), creature);
17892
17893 if (creature->GetLootMode())
17895
17896 if (group)
17897 {
17898 if (hasLooterGuid)
17899 group->SendLooter(creature, looter);
17900 else
17901 group->SendLooter(creature, nullptr);
17902
17903 // Update round robin looter only if the creature had loot
17904 if (!creature->loot.empty())
17905 group->UpdateLooterGuid(creature);
17906 }
17907 }
17908
17909 player->RewardPlayerAndGroupAtKill(victim, false);
17910 }
17911
17912 // Do KILL and KILLED procs. KILL proc is called only for the unit who landed the killing blow (and its owner - for pets and totems) regardless of who tapped the victim
17913 if (killer && (killer->IsPet() || killer->IsTotem()))
17914 if (Unit* owner = killer->GetOwner())
17915 {
17916 Unit::ProcDamageAndSpell(owner, victim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17917 sScriptMgr->OnPlayerCreatureKilledByPet( killer->GetCharmerOrOwnerPlayerOrPlayerItself(), victim->ToCreature());
17918 }
17919
17920 if (killer != victim)
17921 {
17922 Unit::ProcDamageAndSpell(killer, victim, killer ? PROC_FLAG_KILL : 0, PROC_FLAG_KILLED, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17923 }
17924
17925 // Proc auras on death - must be before aura/combat remove
17926 Unit::ProcDamageAndSpell(victim, nullptr, PROC_FLAG_DEATH, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17927
17928 // update get killing blow achievements, must be done before setDeathState to be able to require auras on target
17929 // and before Spirit of Redemption as it also removes auras
17930 if (killer)
17931 if (Player* killerPlayer = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
17932 killerPlayer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, victim);
17933
17934 // Spirit of Redemption
17935 // if talent known but not triggered (check priest class for speedup check)
17936 bool spiritOfRedemption = false;
17938 {
17939 if (AuraEffect* aurEff = victim->GetAuraEffectDummy(20711))
17940 {
17941 // Xinef: aura_spirit_of_redemption is triggered by 27827 shapeshift
17942 if (victim->HasSpiritOfRedemptionAura() || victim->HasAura(27827))
17943 {
17944 /*LOG_INFO("misc", "Player ({}) died with spirit of redemption. Killer (Entry: {}, Name: {}), Map: {}, x: {}, y: {}, z: {}",
17945 victim->GetGUID().ToString(), killer ? killer->GetEntry() : 1, killer ? killer->GetName() : "", victim->GetMapId(), victim->GetPositionX(),
17946 victim->GetPositionY(), victim->GetPositionZ());
17947
17948 ACE_Stack_Trace trace(0, 50);
17949 LOG_INFO("misc", "TRACE: {}\n\n", trace);*/
17950 }
17951 else
17952 {
17953 // save value before aura remove
17954 uint32 ressSpellId = victim->GetUInt32Value(PLAYER_SELF_RES_SPELL);
17955 if (!ressSpellId)
17956 ressSpellId = victim->ToPlayer()->GetResurrectionSpellId();
17957
17958 //Remove all expected to remove at death auras (most important negative case like DoT or periodic triggers)
17959 victim->RemoveAllAurasOnDeath();
17960
17961 // Stop attacks
17962 victim->CombatStop();
17964
17965 // restore for use at real death
17966 victim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId);
17967
17968 // FORM_SPIRITOFREDEMPTION and related auras
17969 victim->CastSpell(victim, 27827, true, nullptr, aurEff);
17970 spiritOfRedemption = true;
17971 }
17972 }
17973 }
17974
17975 if (!spiritOfRedemption)
17976 {
17977 LOG_DEBUG("entities.unit", "SET DeathState::JustDied");
17978 victim->setDeathState(DeathState::JustDied);
17979 }
17980
17981 // Inform pets (if any) when player kills target)
17982 // MUST come after victim->setDeathState(DeathState::JustDied); or pet next target
17983 // selection will get stuck on same target and break pet react state
17984 if (player)
17985 {
17986 Pet* pet = player->GetPet();
17987 if (pet && pet->IsAlive() && pet->isControlled())
17988 pet->AI()->KilledUnit(victim);
17989 }
17990
17991 // 10% durability loss on death
17992 // clean InHateListOf
17993 if (Player* plrVictim = victim->ToPlayer())
17994 {
17995 // remember victim PvP death for corpse type and corpse reclaim delay
17996 // at original death (not at SpiritOfRedemtionTalent timeout)
17997 plrVictim->SetPvPDeath(player != nullptr);
17998
17999 // only if not player and not controlled by player pet. And not at BG
18000 if ((durabilityLoss && !player && !plrVictim->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))
18001 {
18002 LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f);
18003 plrVictim->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f, false);
18004 // durability lost message
18005 plrVictim->SendDurabilityLoss();
18006 }
18007 // Call KilledUnit for creatures
18008 if (killer && killer->IsCreature() && killer->IsAIEnabled)
18009 killer->ToCreature()->AI()->KilledUnit(victim);
18010
18011 // last damage from non duel opponent or opponent controlled creature
18012 if (plrVictim->duel)
18013 {
18014 plrVictim->duel->Opponent->CombatStopWithPets(true);
18015 plrVictim->CombatStopWithPets(true);
18016 plrVictim->DuelComplete(DUEL_INTERRUPTED);
18017 }
18018 }
18019 else // creature died
18020 {
18021 LOG_DEBUG("entities.unit", "DealDamageNotPlayer");
18022
18023 if (!creature->IsPet() && creature->GetLootMode() > 0)
18024 {
18025 creature->GetThreatMgr().ClearAllThreat();
18026
18027 // must be after setDeathState which resets dynamic flags
18028 if (!creature->loot.isLooted())
18029 {
18031 }
18032 else
18033 {
18034 creature->AllLootRemovedFromCorpse();
18035 }
18036 }
18037
18038 // Call KilledUnit for creatures, this needs to be called after the lootable flag is set
18039 if (killer && killer->IsCreature() && killer->IsAIEnabled)
18040 killer->ToCreature()->AI()->KilledUnit(victim);
18041
18042 // Call creature just died function
18043 if (CreatureAI* ai = creature->AI())
18044 {
18045 ai->JustDied(killer);
18046 }
18047
18048 if (TempSummon* summon = creature->ToTempSummon())
18049 {
18050 if (WorldObject* summoner = summon->GetSummoner())
18051 {
18052 if (summoner->ToCreature() && summoner->ToCreature()->IsAIEnabled)
18053 {
18054 summoner->ToCreature()->AI()->SummonedCreatureDies(creature, killer);
18055 }
18056 else if (summoner->ToGameObject() && summoner->ToGameObject()->AI())
18057 {
18058 summoner->ToGameObject()->AI()->SummonedCreatureDies(creature, killer);
18059 }
18060 }
18061 }
18062
18063 // Dungeon specific stuff, only applies to players killing creatures
18064 if (creature->GetInstanceId())
18065 {
18066 Map* instanceMap = creature->GetMap();
18067 //Player* creditedPlayer = GetCharmerOrOwnerPlayerOrPlayerItself();
18069
18070 if (instanceMap->IsDungeon() && player)
18071 if (instanceMap->IsRaidOrHeroicDungeon())
18073 instanceMap->ToInstanceMap()->PermBindAllPlayers();
18074 }
18075 }
18076
18077 // outdoor pvp things, do these after setting the death state, else the player activity notify won't work... doh...
18078 // handle player kill only if not suicide (spirit of redemption for example)
18079 if (player && killer != victim)
18080 {
18081 if (OutdoorPvP* pvp = player->GetOutdoorPvP())
18082 pvp->HandleKill(player, victim);
18083
18084 if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId()))
18085 bf->HandleKill(player, victim);
18086 }
18087
18088 //if (victim->IsPlayer())
18089 // if (OutdoorPvP* pvp = victim->ToPlayer()->GetOutdoorPvP())
18090 // pvp->HandlePlayerActivityChangedpVictim->ToPlayer();
18091
18092 // battleground things (do this at the end, so the death state flag will be properly set to handle in the bg->handlekill)
18093 if (player)
18094 if (Battleground* bg = player->GetBattleground())
18095 {
18096 if (victim->IsPlayer())
18097 bg->HandleKillPlayer(victim->ToPlayer(), player);
18098 else
18099 bg->HandleKillUnit(victim->ToCreature(), player);
18100 }
18101
18102 // achievement stuff
18103 if (killer && victim->IsPlayer())
18104 {
18105 if (killer->IsCreature())
18107 else if (victim != killer && killer->IsPlayer())
18109 }
18110
18111 // Hook for OnPVPKill Event
18112 if (killer)
18113 {
18114 if (Player* killerPlr = killer->ToPlayer())
18115 {
18116 if (Player* killedPlr = victim->ToPlayer())
18117 sScriptMgr->OnPlayerPVPKill(killerPlr, killedPlr);
18118 else if (Creature* killedCre = victim->ToCreature())
18119 sScriptMgr->OnPlayerCreatureKill(killerPlr, killedCre);
18120 }
18121 else if (Creature* killerCre = killer->ToCreature())
18122 {
18123 if (Player* killed = victim->ToPlayer())
18124 sScriptMgr->OnPlayerKilledByCreature(killerCre, killed);
18125 }
18126 }
18127
18128 sScriptMgr->OnUnitDeath(victim, killer);
18129}
LootStore LootTemplates_Creature("creature_loot_template", "creature entry", true)
@ FREE_FOR_ALL
Definition: LootMgr.h:58
#define sBattlefieldMgr
Definition: BattlefieldMgr.h:77
@ PROC_FLAG_KILLED
Definition: SpellMgr.h:107
@ PLAYER_SELF_RES_SPELL
Definition: UpdateFields.h:370
@ CREATURE_FLAG_EXTRA_INSTANCE_BIND
Definition: CreatureData.h:45
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition: Player.h:483
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition: WorldConfig.h:473
@ CONFIG_DURABILITY_LOSS_IN_PVP
Definition: WorldConfig.h:25
@ UNIT_DYNFLAG_LOOTABLE
Definition: SharedDefines.h:3371
@ DUEL_INTERRUPTED
Definition: SharedDefines.h:3878
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER
Definition: DBCEnums.h:138
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE
Definition: DBCEnums.h:137
@ ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS
Definition: DBCEnums.h:170
@ SMSG_PARTYKILLLOG
Definition: Opcodes.h:531
@ SMSG_LOOT_LIST
Definition: Opcodes.h:1047
Player * FindPlayer(ObjectGuid const guid)
Definition: ObjectAccessor.cpp:245
Definition: CreatureAI.h:71
virtual void KilledUnit(Unit *)
Definition: CreatureAI.h:132
Definition: Battlefield.h:204
Loot loot
Definition: Creature.h:230
uint16 GetLootMode() const
Definition: Creature.h:244
void AllLootRemovedFromCorpse()
Definition: Creature.cpp:3004
bool IsLootRewardDisabled() const
Definition: Creature.h:367
Player * GetLootRecipient() const
Definition: Creature.cpp:1317
bool IsDamageEnoughForLootingAndReward() const
Definition: Creature.cpp:3827
Group * GetLootRecipientGroup() const
Definition: Creature.cpp:1324
uint32 mingold
Definition: CreatureData.h:231
uint32 maxgold
Definition: CreatureData.h:232
uint32 lootid
Definition: CreatureData.h:224
virtual void SetDynamicFlag(uint32 flag)
Definition: Object.h:124
uint32 GetInstanceId() const
Definition: Object.h:510
uint32 GetZoneId() const
Definition: Object.cpp:3038
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:5728
TeamId GetTeamId(bool original=false) const
Definition: Player.h:2108
Battleground * GetBattleground(bool create=false) const
Definition: Player.cpp:12223
uint32 GetResurrectionSpellId()
Definition: Player.cpp:12639
OutdoorPvP * GetOutdoorPvP() const
Definition: Player.cpp:12540
void RewardPlayerAndGroupAtKill(Unit *victim, bool isBattleGround)
Definition: Player.cpp:12753
void RemoveAllAurasOnDeath()
Definition: Unit.cpp:5414
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition: Unit.cpp:5615
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition: Group.cpp:1757
uint8 GetMemberGroup(ObjectGuid guid) const
Definition: Group.cpp:2394
ObjectGuid GetLooterGuid() const
Definition: Group.cpp:2331
LootMethod GetLootMethod() const
Definition: Group.cpp:2326
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition: Group.cpp:1868
void SendLooter(Creature *creature, Player *pLooter)
Definition: Group.cpp:967
Definition: LootMgr.h:313
bool empty() const
Definition: LootMgr.h:367
bool isLooted() const
Definition: LootMgr.h:368
void clear()
Definition: LootMgr.h:343
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
Definition: LootMgr.cpp:838
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition: LootMgr.cpp:571
Definition: Map.h:163
bool IsRaidOrHeroicDungeon() const
Definition: Map.h:298
InstanceMap * ToInstanceMap()
Definition: Map.h:377
void PermBindAllPlayers()
Definition: Map.cpp:2204
Definition: OutdoorPvP.h:186

References ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, Creature::AI(), Creature::AllLootRemovedFromCorpse(), Group::BroadcastPacket(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_PRIEST, Loot::clear(), ThreatMgr::ClearAllThreat(), CombatStop(), CONFIG_DURABILITY_LOSS_IN_PVP, CREATURE_FLAG_EXTRA_INSTANCE_BIND, HostileRefMgr::deleteReferences(), DUEL_INTERRUPTED, Loot::empty(), Loot::FillLoot(), ObjectAccessor::FindPlayer(), FREE_FOR_ALL, Loot::generateMoneyLoot(), GetAuraEffectDummy(), Player::GetBattleground(), GetCharmerOrOwnerPlayerOrPlayerItself(), Creature::GetCreatureTemplate(), Object::GetEntry(), Player::GetGroup(), Object::GetGUID(), GetHealth(), getHostileRefMgr(), WorldObject::GetInstanceId(), Group::GetLooterGuid(), Group::GetLootMethod(), Creature::GetLootMode(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), WorldObject::GetMap(), Group::GetMemberGroup(), Player::GetOutdoorPvP(), GetOwner(), GetOwnerGUID(), Player::GetPet(), Player::GetResurrectionSpellId(), Player::GetTeamId(), GetThreatMgr(), Object::GetUInt32Value(), WorldObject::GetZoneId(), HasAura(), Creature::HasFlagsExtra(), Player::HasPlayerFlag(), HasSpiritOfRedemptionAura(), Player::InBattleground(), IsAIEnabled, IsAlive(), IsClass(), Pet::isControlled(), Object::IsCreature(), Creature::IsDamageEnoughForLootingAndReward(), Map::IsDungeon(), WorldObject::IsInMap(), Loot::isLooted(), Creature::IsLootRewardDisabled(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), Map::IsRaidOrHeroicDungeon(), IsTotem(), CreatureAI::KilledUnit(), LOG_DEBUG, Creature::loot, CreatureTemplate::lootid, LootTemplates_Creature, CreatureTemplate::maxgold, CreatureTemplate::mingold, GroupReference::next(), InstanceMap::PermBindAllPlayers(), PLAYER_FLAGS_IS_OUT_OF_BOUNDS, PLAYER_SELF_RES_SPELL, PROC_EX_NONE, PROC_FLAG_DEATH, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_FLAG_NONE, ProcDamageAndSpell(), RATE_DURABILITY_LOSS_ON_DEATH, RemoveAllAurasOnDeath(), Player::RewardPlayerAndGroupAtKill(), sBattlefieldMgr, Player::SendDirectMessage(), Group::SendLooter(), Player::SendMessageToSet(), setDeathState(), Object::SetDynamicFlag(), Creature::SetLootRecipient(), SetUInt32Value(), SMSG_LOOT_LIST, SMSG_PARTYKILLLOG, sScriptMgr, sWorld, Object::ToCreature(), Map::ToInstanceMap(), Object::ToPlayer(), ToTempSummon(), UNIT_DYNFLAG_LOOTABLE, Player::UpdateAchievementCriteria(), and Group::UpdateLooterGuid().

Referenced by boss_headless_horseman_head::DamageTaken(), boss_viscidus::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), boss_jedoga_shadowseeker::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_illidari_council::DoAction(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), DeathEvent::Execute(), BattlegroundIC::HandleCapturedNodes(), misc_commandscript::HandleDieCommand(), spell_ooze_zap_channel_end::HandleDummy(), spell_pos_rimefang_frost_nova::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_yogg_saron_titanic_storm::HandleDummyEffect(), spell_item_rocket_chicken::HandleDummyTick(), spell_ulduar_arachnopod_damaged_aura::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_teron_gorefiend_spiritual_vengeance::HandleEffectRemove(), spell_chapter2_persuasive_strike::HandleHit(), spell_voa_overcharge_aura::HandlePeriodicDummy(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_leotheras_clear_consuming_madness::HandleScriptEffect(), boss_twin_valkyrAI::JustDied(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_sister_svalna::boss_sister_svalnaAI::JustDied(), boss_ignis::boss_ignisAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), boss_ahune::JustDied(), npc_frozen_core::JustDied(), boss_twinemperorsAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), KillSelf(), boss_buru::ManipulateEggs(), npc_burning_spirit::npc_burning_spiritAI::MovementInform(), spell_q12779_an_end_to_all_things_devour_aura::OnRemove(), spell_yogg_saron_insane_aura::OnRemove(), WretchedGhoulCleaner::operator()(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::PassengerBoarded(), SmartScript::ProcessAction(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::RandomizeCompositionsAndShow(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::Update(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::Update(), instance_shattered_halls::instance_shattered_halls_InstanceMapScript::Update(), SimpleCharmedAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_sinkhole_kill_credit::npc_sinkhole_kill_creditAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), and npc_emily::npc_emilyAI::WaypointReached().

◆ KillSelf()

void Unit::KillSelf ( bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
inline
1163{ Kill(this, this, durabilityLoss, attackType, spellProto, spell); };

References Kill().

Referenced by boss_felblood_kaelthas::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_illidari_council::DoAction(), npc_xt002_boombot::npc_xt002_boombotAI::Explode(), npc_raging_flames::FixateRandomTarget(), spell_chapter2_persuasive_strike::HandleHit(), npc_rancid_mushroom::InitializeAI(), boss_warlord_kalithresh::JustDied(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_pet_gen_plump_turkey::MovementInform(), npc_wild_wyrm::npc_wild_wyrmAI::MovementInform(), npc_announcer_toc5::npc_announcer_toc5AI::MovementInform(), boss_glob_of_viscidus::MovementInform(), SmartScript::ProcessAction(), npc_singularity::Reset(), boss_archimonde::Reset(), npc_necropolis_health::SpellHit(), npc_dark_iron_guzzler::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), npc_necrotic_shard::SpellHit(), boss_victor_nefarius::boss_victor_nefariusAI::SummonedCreatureDies(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDies(), npc_icc_gauntlet_controller::npc_icc_gauntlet_controllerAI::SummonedCreatureDies(), boss_vazruden_the_herald::SummonedCreatureDies(), npc_warden_mellichar::npc_warden_mellicharAI::SummonedCreatureDies(), npc_brewfest_super_brew_trigger::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and npc_frost_tomb::UpdateAI().

◆ KnockbackFrom()

void Unit::KnockbackFrom ( float  x,
float  y,
float  speedXY,
float  speedZ 
)
19241{
19242 Player* player = ToPlayer();
19243 if (!player)
19244 {
19245 if (Unit* charmer = GetCharmer())
19246 {
19247 player = charmer->ToPlayer();
19248 if (player && player->m_mover != this)
19249 player = nullptr;
19250 }
19251 }
19252
19253 if (!player)
19254 {
19255 GetMotionMaster()->MoveKnockbackFrom(x, y, speedXY, speedZ);
19256 }
19257 else
19258 {
19259 float vcos, vsin;
19260 GetSinCos(x, y, vsin, vcos);
19261
19262 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19263 data << GetPackGUID();
19264 data << uint32(0); // counter
19265 data << float(vcos); // x direction
19266 data << float(vsin); // y direction
19267 data << float(speedXY); // Horizontal speed
19268 data << float(-speedZ); // Z Movement speed (vertical)
19269
19270 player->GetSession()->SendPacket(&data);
19271
19272 if (player->HasIncreaseMountedFlightSpeedAura() || player->HasFlyAura())
19273 player->SetCanFly(true, true);
19274
19275 player->SetCanKnockback(true);
19276 }
19277}
void GetSinCos(float x, float y, float &vsin, float &vcos) const
Definition: Position.cpp:99
SafeUnitPointer m_mover
Definition: Player.h:2337
void SetCanKnockback(bool value)
Definition: Player.h:2503
bool SetCanFly(bool apply, bool packetOnly=false) override
Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pre...
Definition: Player.cpp:15945
bool HasFlyAura() const
Definition: Unit.h:1720
bool HasIncreaseMountedFlightSpeedAura() const
Definition: Unit.h:1747
void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ)
Definition: MotionMaster.cpp:593

References GetCharmer(), GetMotionMaster(), Object::GetPackGUID(), Player::GetSession(), Position::GetSinCos(), HasFlyAura(), HasIncreaseMountedFlightSpeedAura(), Player::m_mover, MotionMaster::MoveKnockbackFrom(), WorldSession::SendPacket(), Player::SetCanFly(), Player::SetCanKnockback(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by _ExitVehicle(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), Spell::EffectKnockBack(), spell_warhead_detonate::HandleDummy(), npc_vekjik::OnGossipSelect(), and npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI().

◆ MagicSpellHitResult()

SpellMissInfo Unit::MagicSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3362{
3363 // Can`t miss on dead target (on skinning for example)
3364 if (!victim->IsAlive() && !victim->IsPlayer())
3365 return SPELL_MISS_NONE;
3366
3367 // vehicles cant miss
3368 if (IsVehicle())
3369 return SPELL_MISS_NONE;
3370
3371 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3372 // resist and deflect chances
3373 // xinef: skip all calculations, proof: Toxic Tolerance quest
3374 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3375 return SPELL_MISS_NONE;
3376
3377 if (spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
3378 {
3379 return SPELL_MISS_NONE;
3380 }
3381
3382 SpellSchoolMask schoolMask = spellInfo->GetSchoolMask();
3383 int32 thisLevel = getLevelForTarget(victim);
3384 if (IsCreature() && ToCreature()->IsTrigger())
3385 thisLevel = std::max<int32>(thisLevel, spellInfo->SpellLevel);
3386 int32 levelDiff = int32(victim->getLevelForTarget(this)) - thisLevel;
3387
3388 int32 MISS_CHANCE_MULTIPLIER;
3389 if (sWorld->getBoolConfig(CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS) && !IsPlayer()) // keep it as it was originally (7 and 11)
3390 {
3391 MISS_CHANCE_MULTIPLIER = victim->IsPlayer() ? 7 : 11;
3392 }
3393 else
3394 {
3395 MISS_CHANCE_MULTIPLIER = sWorld->getRate(
3396 victim->IsPlayer()
3399 }
3400
3401 // Base hit chance from attacker and victim levels
3402 int32 modHitChance = levelDiff < 3
3403 ? 96 - levelDiff
3404 : 94 - (levelDiff - 2) * MISS_CHANCE_MULTIPLIER;
3405
3406 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
3407 if (Player* modOwner = GetSpellModOwner())
3408 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_RESIST_MISS_CHANCE, modHitChance);
3409
3410 // Increase from attacker SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT auras
3412
3413 // Spells with SPELL_ATTR3_ALWAYS_HIT will ignore target's avoidance effects
3414 // xinef: imo it should completly ignore all calculations, eg: 14792. Hits 80 level players on blizz without any problems
3415 //if (!spell->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3416 {
3417 // Chance hit from victim SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE auras
3419 // Reduce spell hit chance for Area of effect spells from victim SPELL_AURA_MOD_AOE_AVOIDANCE aura
3420 if (spellInfo->IsAffectingArea())
3421 modHitChance -= victim->GetTotalAuraModifier(SPELL_AURA_MOD_AOE_AVOIDANCE);
3422
3423 // Decrease hit chance from victim rating bonus
3424 if (victim->IsPlayer())
3425 modHitChance -= int32(victim->ToPlayer()->GetRatingBonusValue(CR_HIT_TAKEN_SPELL));
3426 }
3427
3428 int32 HitChance = modHitChance * 100;
3429 // Increase hit chance from attacker SPELL_AURA_MOD_SPELL_HIT_CHANCE and attacker ratings
3430 // Xinef: Totems should inherit casters ratings?
3431 if (IsTotem())
3432 {
3433 if (Unit* owner = GetOwner())
3434 HitChance += int32(owner->m_modSpellHitChance * 100.0f);
3435 }
3436 else
3437 HitChance += int32(m_modSpellHitChance * 100.0f);
3438
3439 if (HitChance < 100)
3440 HitChance = 100;
3441 else if (HitChance > 10000)
3442 HitChance = 10000;
3443
3444 int32 tmp = 10000 - HitChance;
3445
3446 int32 rand = irand(1, 10000); // Needs to be 1 to 10000 to avoid the 1/10000 chance to miss on 100% hit rating
3447
3448 if (rand < tmp)
3449 return SPELL_MISS_MISS;
3450
3451 // Chance resist mechanic (select max value from every mechanic spell effect)
3452 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3453 tmp += resist_chance;
3454
3455 // Chance resist debuff
3456 if (!spellInfo->IsPositive() && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))
3457 {
3458 bool bNegativeAura = true;
3459 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3460 {
3461 // Xinef: Check if effect exists!
3462 if (spellInfo->Effects[i].IsEffect() && spellInfo->Effects[i].ApplyAuraName == 0)
3463 {
3464 bNegativeAura = false;
3465 break;
3466 }
3467 }
3468
3469 if (bNegativeAura)
3470 {
3471 tmp += victim->GetMaxPositiveAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3472 tmp += victim->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3473 }
3474
3475 // Players resistance for binary spells
3476 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && (spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_NORMAL | SPELL_SCHOOL_MASK_HOLY)) == 0)
3477 tmp += int32(Unit::GetEffectiveResistChance(this, spellInfo->GetSchoolMask(), victim) * 10000.0f); // 100 for spell calculations, and 100 for return value percentage
3478 }
3479
3480 // Roll chance
3481 if (rand < tmp)
3482 return SPELL_MISS_RESIST;
3483
3484 // cast by caster in front of victim
3485 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasIgnoreHitDirectionAura()))
3486 {
3487 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3488 tmp += deflect_chance;
3489 if (rand < tmp)
3490 return SPELL_MISS_DEFLECT;
3491 }
3492
3493 return SPELL_MISS_NONE;
3494}
@ SPELL_AURA_MOD_DEBUFF_RESISTANCE
Definition: SpellAuraDefines.h:241
@ SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT
Definition: SpellAuraDefines.h:262
@ SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE
Definition: SpellAuraDefines.h:249
@ SPELL_AURA_MOD_AOE_AVOIDANCE
Definition: SpellAuraDefines.h:223
@ SPELLMOD_RESIST_MISS_CHANCE
Definition: SpellDefines.h:92
@ CR_HIT_TAKEN_SPELL
Definition: Unit.h:231
@ CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS
Definition: WorldConfig.h:131
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER
Definition: WorldConfig.h:481
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE
Definition: WorldConfig.h:480
@ SPELL_ATTR7_NO_ATTACK_MISS
Definition: SharedDefines.h:677
@ SPELL_MISS_NONE
Definition: SharedDefines.h:1530
@ SPELL_MISS_RESIST
Definition: SharedDefines.h:1532
@ SPELL_MISS_MISS
Definition: SharedDefines.h:1531
@ SPELL_MISS_DEFLECT
Definition: SharedDefines.h:1539
float GetRatingBonusValue(CombatRating cr) const
Definition: Player.cpp:5234
int32 GetMaxNegativeAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:6148
int32 GetMaxPositiveAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:6134
int32 GetMechanicResistChance(SpellInfo const *spell)
Definition: Unit.cpp:3167

References CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS, CR_HIT_TAKEN_SPELL, SpellInfo::Dispel, SpellInfo::Effects, GetEffectiveResistChance(), getLevelForTarget(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifierByMiscValue(), GetMechanicResistChance(), GetOwner(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, irand(), SpellInfo::IsAffectingArea(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), SpellInfo::IsPositive(), IsTotem(), IsVehicle(), m_modSpellHitChance, MAX_SPELL_EFFECTS, RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE, RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER, SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_NO_CAST_LOG, SPELL_ATTR7_NO_ATTACK_MISS, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_MOD_AOE_AVOIDANCE, SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE, SPELL_AURA_MOD_DEBUFF_RESISTANCE, SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT, SPELL_MISS_DEFLECT, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_RESIST, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NORMAL, SpellInfo::SpellLevel, SPELLMOD_RESIST_MISS_CHANCE, sWorld, Object::ToCreature(), Object::ToPlayer(), and UNIT_STATE_STUNNED.

Referenced by SpellHitResult().

◆ MeleeDamageBonusDone()

uint32 Unit::MeleeDamageBonusDone ( Unit pVictim,
uint32  damage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13169{
13170 if (!victim || pdamage == 0)
13171 return 0;
13172
13173 if (IsCreature())
13174 {
13175 // Dancing Rune Weapon...
13176 if (GetEntry() == 27893)
13177 {
13178 if (Unit* owner = GetOwner())
13179 return owner->MeleeDamageBonusDone(victim, pdamage, attType, spellProto, damageSchoolMask) / 2;
13180 }
13181 }
13182
13183 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
13184
13185 // Done fixed damage bonus auras
13186 int32 DoneFlatBenefit = 0;
13187
13188 // ..done
13190 for (AuraEffectList::const_iterator i = mDamageDoneCreature.begin(); i != mDamageDoneCreature.end(); ++i)
13191 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13192 DoneFlatBenefit += (*i)->GetAmount();
13193
13194 // ..done
13195 // SPELL_AURA_MOD_DAMAGE_DONE included in weapon damage
13196
13197 // ..done (base at attack power for marked target and base at attack power for creature type)
13198 int32 APbonus = 0;
13199
13200 if (attType == RANGED_ATTACK)
13201 {
13202 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
13203
13204 // ..done (base at attack power and creature type)
13206 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13207 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13208 APbonus += (*i)->GetAmount();
13209 }
13210 else
13211 {
13212 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
13213
13214 // ..done (base at attack power and creature type)
13216 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13217 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13218 APbonus += (*i)->GetAmount();
13219 }
13220
13221 if (APbonus != 0) // Can be negative
13222 {
13223 bool normalized = false;
13224 if (spellProto)
13225 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13226 if (spellProto->Effects[i].Effect == SPELL_EFFECT_NORMALIZED_WEAPON_DMG)
13227 {
13228 normalized = true;
13229 break;
13230 }
13231 DoneFlatBenefit += int32(APbonus / 14.0f * GetAPMultiplier(attType, normalized));
13232 }
13233
13234 // Done total percent damage auras
13235 float DoneTotalMod = 1.0f;
13236
13237 // mods for SPELL_SCHOOL_MASK_NORMAL are already factored in base melee damage calculation
13238 if (!(damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL))
13239 {
13240 // Some spells don't benefit from pct done mods
13242 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
13243 {
13244 if (!spellProto || (spellProto->ValidateAttribute6SpellDamageMods(this, *i, false) &&
13245 sScriptMgr->IsNeedModMeleeDamagePercent(this, *i, DoneTotalMod, spellProto)))
13246 {
13247 if (((*i)->GetMiscValue() & damageSchoolMask))
13248 {
13249 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
13250 AddPct(DoneTotalMod, (*i)->GetAmount());
13251 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
13252 AddPct(DoneTotalMod, (*i)->GetAmount());
13253 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
13254 AddPct(DoneTotalMod, (*i)->GetAmount());
13255 }
13256 }
13257 }
13258 }
13259
13261 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
13262 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13263 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13264 AddPct(DoneTotalMod, (*i)->GetAmount());
13265
13266 // bonus against aurastate
13268 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
13269 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())))
13270 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13271 AddPct(DoneTotalMod, (*i)->GetAmount());
13272
13273 // done scripted mod (take it from owner)
13274 Unit* owner = GetOwner() ? GetOwner() : this;
13275 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13276 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
13277 {
13278 if (spellProto && !spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13279 continue;
13280
13281 if (!(*i)->IsAffectedOnSpell(spellProto))
13282 continue;
13283
13284 switch ((*i)->GetMiscValue())
13285 {
13286 // Tundra Stalker
13287 // Merciless Combat
13288 case 7277:
13289 {
13290 // Merciless Combat
13291 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
13292 {
13293 if (!victim->HealthAbovePct(35))
13294 AddPct(DoneTotalMod, (*i)->GetAmount());
13295 }
13296 // Tundra Stalker
13297 else
13298 {
13299 // Frost Fever (target debuff)
13300 if (victim->HasAura(55095))
13301 AddPct(DoneTotalMod, (*i)->GetAmount());
13302 }
13303 break;
13304 }
13305 // Rage of Rivendare
13306 case 7293:
13307 {
13308 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0x02000000, 0))
13309 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
13310 break;
13311 }
13312 // Marked for Death
13313 case 7598:
13314 case 7599:
13315 case 7600:
13316 case 7601:
13317 case 7602:
13318 {
13319 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
13320 AddPct(DoneTotalMod, (*i)->GetAmount());
13321 break;
13322 }
13323 // Dirty Deeds
13324 case 6427:
13325 case 6428:
13326 {
13327 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
13328 {
13329 // effect 0 has expected value but in negative state
13330 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
13331 AddPct(DoneTotalMod, bonus);
13332 }
13333 break;
13334 }
13335 }
13336 }
13337
13338 // Custom scripted damage
13339 if (spellProto)
13340 switch (spellProto->SpellFamilyName)
13341 {
13343 // Glacier Rot
13344 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
13346 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
13347 AddPct(DoneTotalMod, aurEff->GetAmount());
13348 break;
13349 }
13350
13351 // Some spells don't benefit from done mods
13352 if (spellProto)
13353 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
13354 {
13355 DoneFlatBenefit = 0;
13356 DoneTotalMod = 1.0f;
13357 }
13358
13359 float tmpDamage = float(int32(pdamage) + DoneFlatBenefit) * DoneTotalMod;
13360
13361 // apply spellmod to Done damage
13362 if (spellProto)
13363 if (Player* modOwner = GetSpellModOwner())
13364 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_DAMAGE, tmpDamage);
13365
13366 // bonus result can be negative
13367 return uint32(std::max(tmpDamage, 0.0f));
13368}
@ SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS
Definition: SpellAuraDefines.h:165
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS
Definition: SpellAuraDefines.h:231
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS
Definition: SpellAuraDefines.h:194
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
Definition: SpellAuraDefines.h:142
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE
Definition: SpellAuraDefines.h:366
@ SPELL_AURA_MOD_DAMAGE_DONE_CREATURE
Definition: SpellAuraDefines.h:122
@ SPELLMOD_DAMAGE
Definition: SpellDefines.h:76
@ SPELL_EFFECT_NORMALIZED_WEAPON_DMG
Definition: SharedDefines.h:910
@ SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM
Definition: SharedDefines.h:594
@ SPELL_ATTR3_IGNORE_CASTER_MODIFIERS
Definition: SharedDefines.h:533
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
Definition: Unit.cpp:17301
AuraEffect * GetDummyAuraEffect(SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
Definition: Unit.h:1362

References AddPct(), AURA_STATE_HEALTHLESS_35_PERCENT, SpellInfo::Effects, GetAPMultiplier(), GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), GetSpellModOwner(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HealthAbovePct(), SpellInfo::Id, Object::IsCreature(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_DAMAGE_DONE_CREATURE, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_EFFECT_NORMALIZED_WEAPON_DMG, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_DAMAGE, sScriptMgr, Object::ToPlayer(), and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeDamageBonusTaken()

uint32 Unit::MeleeDamageBonusTaken ( Unit attacker,
uint32  pdamage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13371{
13372 if (pdamage == 0)
13373 return 0;
13374
13375 int32 TakenFlatBenefit = 0;
13376
13377 // ..taken
13379 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
13380 if ((*i)->GetMiscValue() & damageSchoolMask)
13381 TakenFlatBenefit += (*i)->GetAmount();
13382
13383 if (attType != RANGED_ATTACK)
13385 else
13387
13388 // Taken total percent damage auras
13389 float TakenTotalMod = 1.0f;
13390
13392
13393 // .. taken pct (special attacks)
13394 if (spellProto)
13395 {
13396 // From caster spells
13398 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
13399 if ((*i)->GetCasterGUID() == attacker->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
13400 AddPct(TakenTotalMod, (*i)->GetAmount());
13401
13402 // Mod damage from spell mechanic
13403 uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask();
13404
13405 // Shred, Maul - "Effects which increase Bleed damage also increase Shred damage"
13406 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[0] & 0x00008800)
13407 mechanicMask |= (1 << MECHANIC_BLEED);
13408
13409 if (mechanicMask)
13410 {
13412 for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i)
13413 if (mechanicMask & uint32(1 << ((*i)->GetMiscValue())))
13414 AddPct(TakenTotalMod, (*i)->GetAmount());
13415 }
13416 }
13417
13418 TakenTotalMod = processDummyAuras(TakenTotalMod);
13419
13420 // .. taken pct: class scripts
13421 /*AuraEffectList const& mclassScritAuras = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13422 for (AuraEffectList::const_iterator i = mclassScritAuras.begin(); i != mclassScritAuras.end(); ++i)
13423 {
13424 switch ((*i)->GetMiscValue())
13425 {
13426 }
13427 }*/
13428
13429 if (attType != RANGED_ATTACK)
13430 {
13432 for (AuraEffectList::const_iterator i = mModMeleeDamageTakenPercent.begin(); i != mModMeleeDamageTakenPercent.end(); ++i)
13433 AddPct(TakenTotalMod, (*i)->GetAmount());
13434 }
13435 else
13436 {
13437 AuraEffectList const& mModRangedDamageTakenPercent = GetAuraEffectsByType(SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT);
13438 for (AuraEffectList::const_iterator i = mModRangedDamageTakenPercent.begin(); i != mModRangedDamageTakenPercent.end(); ++i)
13439 AddPct(TakenTotalMod, (*i)->GetAmount());
13440 }
13441
13442 // No positive taken bonus, custom attr
13443 if (spellProto)
13444 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
13445 {
13446 TakenFlatBenefit = 0;
13447 TakenTotalMod = 1.0f;
13448 }
13449
13450 // xinef: sanctified wrath talent
13451 if (TakenTotalMod < 1.0f && attacker->HasIgnoreTargetResistAura())
13452 {
13453 float ignoreModifier = 1.0f - TakenTotalMod;
13454 bool addModifier = false;
13456 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
13457 if ((*j)->GetMiscValue() & damageSchoolMask)
13458 {
13459 ApplyPct(ignoreModifier, (*j)->GetAmount());
13460 addModifier = true;
13461 }
13462
13463 if (addModifier)
13464 TakenTotalMod += ignoreModifier;
13465 }
13466
13467 float tmpDamage = (float(pdamage) + TakenFlatBenefit) * TakenTotalMod;
13468
13469 // bonus result can be negative
13470 return uint32(std::max(tmpDamage, 0.0f));
13471}
@ SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS
Definition: SpellInfo.h:197
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN
Definition: SpellAuraDefines.h:176
@ SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
Definition: SpellAuraDefines.h:150
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN
Definition: SpellAuraDefines.h:188
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT
Definition: SpellAuraDefines.h:189
@ SPELL_AURA_MOD_DAMAGE_TAKEN
Definition: SpellAuraDefines.h:77
@ SPELL_AURA_MOD_DAMAGE_FROM_CASTER
Definition: SpellAuraDefines.h:334
@ SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT
Definition: SpellAuraDefines.h:318
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT
Definition: SpellAuraDefines.h:177
float processDummyAuras(float TakenTotalMod) const
Definition: Unit.cpp:11994
bool HasIgnoreTargetResistAura() const
Definition: Unit.h:1745

References AddPct(), ApplyPct(), SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), GetTotalAuraModifier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreTargetResistAura(), MECHANIC_BLEED, processDummyAuras(), RANGED_ATTACK, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_DAMAGE_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeSpellHitResult()

SpellMissInfo Unit::MeleeSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3189{
3190 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3191 // resist and deflect chances
3192 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3193 return SPELL_MISS_NONE;
3194
3195 WeaponAttackType attType = BASE_ATTACK;
3196
3197 // Check damage class instead of attack type to correctly handle judgements
3198 // - they are meele, but can't be dodged/parried/deflected because of ranged dmg class
3199 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED)
3200 attType = RANGED_ATTACK;
3201
3202 int32 attackerWeaponSkill;
3203 // skill value for these spells (for example judgements) is 5* level
3204 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED && !spellInfo->IsRangedWeaponSpell())
3205 attackerWeaponSkill = GetLevel() * 5;
3206 // bonus from skills is 0.04% per skill Diff
3207 else
3208 attackerWeaponSkill = int32(GetWeaponSkillValue(attType, victim));
3209
3210 int32 skillDiff = attackerWeaponSkill - int32(victim->GetMaxSkillValueForLevel(this));
3211
3212 uint32 roll = urand (0, 10000);
3213
3214 uint32 missChance = uint32(MeleeSpellMissChance(victim, attType, skillDiff, spellInfo->Id) * 100.0f);
3215 // Roll miss
3216 uint32 tmp = missChance;
3217 if (roll < tmp)
3218 return SPELL_MISS_MISS;
3219
3220 bool canDodge = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_DODGE);
3221 bool canParry = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_PARRY);
3222 bool canBlock = spellInfo->HasAttribute(SPELL_ATTR3_COMPLETELY_BLOCKED) && !spellInfo->HasAttribute(SPELL_ATTR0_CU_DIRECT_DAMAGE);
3223
3224 // Same spells cannot be parry/dodge
3225 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3226 return SPELL_MISS_NONE;
3227
3228 // Chance resist mechanic
3229 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3230 tmp += resist_chance;
3231 if (roll < tmp)
3232 return SPELL_MISS_RESIST;
3233
3234 // Ranged attacks can only miss, resist and deflect
3235 if (attType == RANGED_ATTACK)
3236 {
3237 // only if in front
3238 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasIgnoreHitDirectionAura()))
3239 {
3240 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3241 tmp += deflect_chance;
3242 if (roll < tmp)
3243 return SPELL_MISS_DEFLECT;
3244 }
3245
3246 canDodge = false;
3247 canParry = false;
3248 }
3249
3250 // Check for attack from behind
3251 // xinef: if from behind or spell requires cast from behind
3252 if (!victim->HasInArc(M_PI, this))
3253 {
3254 if (!victim->HasIgnoreHitDirectionAura() || spellInfo->HasAttribute(SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET))
3255 {
3256 // Can`t dodge from behind in PvP (but its possible in PvE)
3257 if (victim->IsPlayer())
3258 {
3259 canDodge = false;
3260 }
3261
3262 // Can`t parry or block
3263 canParry = false;
3264 canBlock = false;
3265 }
3266 }
3267
3268 // Check creatures flags_extra for disable parry
3269 if (victim->IsCreature())
3270 {
3271 uint32 flagEx = victim->ToCreature()->GetCreatureTemplate()->flags_extra;
3272 // Xinef: no dodge flag
3273 if (flagEx & CREATURE_FLAG_EXTRA_NO_DODGE)
3274 canDodge = false;
3275 if (flagEx & CREATURE_FLAG_EXTRA_NO_PARRY)
3276 canParry = false;
3277 // Check creatures flags_extra for disable block
3278 if (flagEx & CREATURE_FLAG_EXTRA_NO_BLOCK)
3279 canBlock = false;
3280 }
3281 // Ignore combat result aura
3283 for (AuraEffectList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
3284 {
3285 if (!(*i)->IsAffectedOnSpell(spellInfo))
3286 continue;
3287 switch ((*i)->GetMiscValue())
3288 {
3289 case MELEE_HIT_DODGE:
3290 canDodge = false;
3291 break;
3292 case MELEE_HIT_BLOCK:
3293 canBlock = false;
3294 break;
3295 case MELEE_HIT_PARRY:
3296 canParry = false;
3297 break;
3298 default:
3299 LOG_DEBUG("entities.unit", "Spell {} SPELL_AURA_IGNORE_COMBAT_RESULT has unhandled state {}", (*i)->GetId(), (*i)->GetMiscValue());
3300 break;
3301 }
3302 }
3303
3304 if (canDodge)
3305 {
3306 // Roll dodge
3307 int32 dodgeChance = int32(victim->GetUnitDodgeChance() * 100.0f) - skillDiff * 4;
3308 // Reduce enemy dodge chance by SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
3310 dodgeChance = int32(float(dodgeChance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
3311 // Reduce dodge chance by attacker expertise rating
3312 if (IsPlayer())
3313 dodgeChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3314 else
3316
3317 // xinef: cant dodge while casting or while stunned
3318 if (dodgeChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3319 dodgeChance = 0;
3320
3321 tmp += dodgeChance;
3322 if (roll < tmp)
3323 return SPELL_MISS_DODGE;
3324 }
3325
3326 if (canParry)
3327 {
3328 // Roll parry
3329 int32 parryChance = int32(victim->GetUnitParryChance() * 100.0f) - skillDiff * 4;
3330 // Reduce parry chance by attacker expertise rating
3331 if (IsPlayer())
3332 parryChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3333 else
3335
3336 // xinef: cant parry while casting or while stunned
3337 if (parryChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3338 parryChance = 0;
3339
3340 tmp += parryChance;
3341 if (roll < tmp)
3342 return SPELL_MISS_PARRY;
3343 }
3344
3345 if (canBlock)
3346 {
3347 int32 blockChance = int32(victim->GetUnitBlockChance() * 100.0f) - skillDiff * 4;
3348
3349 // xinef: cant block while casting or while stunned
3350 if (blockChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3351 blockChance = 0;
3352
3353 tmp += blockChance;
3354 if (roll < tmp)
3355 return SPELL_MISS_BLOCK;
3356 }
3357
3358 return SPELL_MISS_NONE;
3359}
@ SPELL_ATTR0_CU_DIRECT_DAMAGE
Definition: SpellInfo.h:184
@ SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET
Definition: SpellInfo.h:193
@ SPELL_AURA_MOD_EXPERTISE
Definition: SpellAuraDefines.h:303
@ SPELL_AURA_IGNORE_COMBAT_RESULT
Definition: SpellAuraDefines.h:265
@ SPELL_AURA_MOD_ENEMY_DODGE
Definition: SpellAuraDefines.h:314
@ SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
Definition: SpellAuraDefines.h:311
@ CREATURE_FLAG_EXTRA_NO_PARRY
Definition: CreatureData.h:47
@ CREATURE_FLAG_EXTRA_NO_DODGE
Definition: CreatureData.h:68
@ SPELL_ATTR7_NO_ATTACK_PARRY
Definition: SharedDefines.h:676
@ SPELL_ATTR7_NO_ATTACK_DODGE
Definition: SharedDefines.h:675
@ SPELL_ATTR3_COMPLETELY_BLOCKED
Definition: SharedDefines.h:507
@ SPELL_MISS_PARRY
Definition: SharedDefines.h:1534
@ SPELL_MISS_DODGE
Definition: SharedDefines.h:1533
@ SPELL_MISS_BLOCK
Definition: SharedDefines.h:1535
uint32 flags_extra
Definition: CreatureData.h:246
float GetUnitDodgeChance() const
Definition: Unit.cpp:3674
float GetTotalAuraMultiplier(AuraType auratype) const
Definition: Unit.cpp:6020
float GetUnitParryChance() const
Definition: Unit.cpp:3691
float MeleeSpellMissChance(Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
Definition: Unit.cpp:19085

References BASE_ATTACK, CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, SpellInfo::DmgClass, CreatureTemplate::flags_extra, GetAuraEffectsByType(), Creature::GetCreatureTemplate(), GetLevel(), GetMaxSkillValueForLevel(), GetMechanicResistChance(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetUnitBlockChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, Object::IsCreature(), IsNonMeleeSpellCast(), Object::IsPlayer(), SpellInfo::IsRangedWeaponSpell(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_DODGE, MELEE_HIT_PARRY, MeleeSpellMissChance(), RANGED_ATTACK, SPELL_ATTR0_CU_DIRECT_DAMAGE, SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET, SPELL_ATTR0_NO_ACTIVE_DEFENSE, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR3_COMPLETELY_BLOCKED, SPELL_ATTR7_NO_ATTACK_DODGE, SPELL_ATTR7_NO_ATTACK_PARRY, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_IGNORE_COMBAT_RESULT, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, SPELL_DAMAGE_CLASS_RANGED, SPELL_MISS_BLOCK, SPELL_MISS_DEFLECT, SPELL_MISS_DODGE, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_PARRY, SPELL_MISS_RESIST, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONTROLLED, UNIT_STATE_STUNNED, urand(), and VICTIMSTATE_DODGE.

Referenced by SpellHitResult().

◆ MeleeSpellMissChance()

float Unit::MeleeSpellMissChance ( Unit const *  victim,
WeaponAttackType  attType,
int32  skillDiff,
uint32  spellId 
) const
19086{
19087 SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;
19088 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
19089 {
19090 return 0.0f;
19091 }
19092
19093 //calculate miss chance
19094 float missChance = victim->GetUnitMissChance(attType);
19095
19096 // Check if dual wielding, add additional miss penalty - when mainhand has on next swing spell, offhand doesnt suffer penalty
19097 if (!spellId && (attType != RANGED_ATTACK) && HasOffhandWeaponForAttack() && (!m_currentSpells[CURRENT_MELEE_SPELL] || !m_currentSpells[CURRENT_MELEE_SPELL]->IsNextMeleeSwingSpell()))
19098 {
19099 missChance += 19;
19100 }
19101
19102 // bonus from skills is 0.04%
19103 //miss_chance -= skillDiff * 0.04f;
19104 int32 diff = -skillDiff;
19105 if (victim->IsPlayer())
19106 missChance += diff > 0 ? diff * 0.04f : diff * 0.02f;
19107 else
19108 missChance += diff > 10 ? 1 + (diff - 10) * 0.4f : diff * 0.1f;
19109
19110 // Calculate hit chance
19111 float hitChance = 100.0f;
19112
19113 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
19114 if (spellId)
19115 {
19116 if (Player* modOwner = GetSpellModOwner())
19117 modOwner->ApplySpellMod(spellId, SPELLMOD_RESIST_MISS_CHANCE, hitChance);
19118 }
19119
19120 missChance -= hitChance - 100.0f;
19121
19122 if (attType == RANGED_ATTACK)
19123 missChance -= m_modRangedHitChance;
19124 else
19125 missChance -= m_modMeleeHitChance;
19126
19127 // Limit miss chance from 0 to 60%
19128 if (missChance < 0.0f)
19129 return 0.0f;
19130 if (missChance > 60.0f)
19131 return 60.0f;
19132 return missChance;
19133}

References CURRENT_MELEE_SPELL, GetSpellModOwner(), GetUnitMissChance(), SpellInfo::HasAttribute(), HasOffhandWeaponForAttack(), Object::IsPlayer(), m_currentSpells, m_modMeleeHitChance, m_modRangedHitChance, RANGED_ATTACK, SPELL_ATTR7_NO_ATTACK_MISS, SPELLMOD_RESIST_MISS_CHANCE, and sSpellMgr.

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ ModifyAuraState()

void Unit::ModifyAuraState ( AuraStateType  flag,
bool  apply 
)
10593{
10594 if (apply)
10595 {
10596 if (!HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10597 {
10598 SetFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10599 Unit::AuraMap& tAuras = GetOwnedAuras();
10600 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10601 {
10602 if ((*itr).second->IsRemoved())
10603 continue;
10604
10605 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10606 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10607 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, true);
10608 }
10609 }
10610 }
10611 else
10612 {
10613 if (HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10614 {
10615 RemoveFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10616
10617 if (flag != AURA_STATE_ENRAGE) // enrage aura state triggering continues auras
10618 {
10619 Unit::AuraMap& tAuras = GetOwnedAuras();
10620 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10621 {
10622 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10623 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10624 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, false);
10625 }
10626 }
10627 }
10628 }
10629}
@ AURA_EFFECT_HANDLE_REAL
Definition: SpellAuraDefines.h:42
@ AURA_STATE_ENRAGE
Definition: SharedDefines.h:1320
void SetFlag(uint16 index, uint32 newFlag)
Definition: Object.cpp:834
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition: Object.cpp:849
std::multimap< uint32, Aura * > AuraMap
Definition: Unit.h:625
AuraMap & GetOwnedAuras()
Definition: Unit.h:1298

References AURA_EFFECT_HANDLE_REAL, AURA_STATE_ENRAGE, Object::GetGUID(), GetOwnedAuras(), Object::HasFlag(), Object::RemoveFlag(), Object::SetFlag(), and UNIT_FIELD_AURASTATE.

Referenced by _ApplyAura(), _UnapplyAura(), ClearAllReactives(), Spell::finish(), debug_commandscript::HandleDebugSetAuraStateCommand(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), ProcDamageAndSpellFor(), Update(), and UpdateReactives().

◆ ModifyHealth()

int32 Unit::ModifyHealth ( int32  val)
14193{
14194 int32 gain = 0;
14195
14196 if (dVal == 0)
14197 return 0;
14198
14199 int32 curHealth = (int32)GetHealth();
14200
14201 int32 val = dVal + curHealth;
14202 if (val <= 0)
14203 {
14204 SetHealth(0);
14205 return -curHealth;
14206 }
14207
14208 int32 maxHealth = (int32)GetMaxHealth();
14209
14210 if (val < maxHealth)
14211 {
14212 SetHealth(val);
14213 gain = val - curHealth;
14214 }
14215 else if (curHealth != maxHealth)
14216 {
14217 SetHealth(maxHealth);
14218 gain = maxHealth - curHealth;
14219 }
14220
14221 return gain;
14222}

References GetHealth(), GetMaxHealth(), and SetHealth().

Referenced by DealDamage(), DealHeal(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::RegenerateHealth(), Player::RegenerateHealth(), npc_injured_patient::npc_injured_patientAI::Reset(), Spell::TakePower(), Aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ ModifyPower()

int32 Unit::ModifyPower ( Powers  power,
int32  val,
bool  withPowerUpdate = true 
)
14251{
14252 if (dVal == 0)
14253 return 0;
14254
14255 int32 gain = 0;
14256
14257 int32 curPower = (int32)GetPower(power);
14258
14259 int32 val = dVal + curPower;
14260 if (val <= 0)
14261 {
14262 SetPower(power, 0, withPowerUpdate);
14263 return -curPower;
14264 }
14265
14266 int32 maxPower = (int32)GetMaxPower(power);
14267
14268 if (val < maxPower)
14269 {
14270 SetPower(power, val, withPowerUpdate);
14271 gain = val - curPower;
14272 }
14273 else if (curPower != maxPower)
14274 {
14275 SetPower(power, maxPower, withPowerUpdate);
14276 gain = maxPower - curPower;
14277 }
14278
14279 if (GetAI())
14280 {
14281 GetAI()->OnPowerUpdate(power, gain, dVal, curPower);
14282 }
14283
14284 return gain;
14285}
virtual void OnPowerUpdate(Powers, int32, int32, uint32)
Called when the creature power updates.
Definition: UnitAI.h:374
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition: Unit.cpp:15667

References GetAI(), GetMaxPower(), GetPower(), UnitAI::OnPowerUpdate(), and SetPower().

Referenced by CalcAbsorbResist(), spell_igb_cannon_blast::CalculatePower(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), EnergizeBySpell(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_kelthuzad_detonate_mana_aura::HandleScript(), boss_pathaleon_the_calculator::JustEngagedWith(), boss_curator::JustEngagedWith(), Pet::LoseHappiness(), ModifyPowerPct(), Creature::Regenerate(), RewardRage(), Pet::setDeathState(), Spell::TakePower(), Spell::TakeRunePower(), Aura::Update(), and boss_faction_championsAI::UpdateAI().

◆ ModifyPowerPct()

int32 Unit::ModifyPowerPct ( Powers  power,
float  pct,
bool  apply = true 
)
14289{
14290 float amount = (float)GetMaxPower(power);
14291 ApplyPercentModFloatVar(amount, pct, apply);
14292
14293 return ModifyPower(power, (int32)amount - (int32)GetMaxPower(power));
14294}

References ApplyPercentModFloatVar(), GetMaxPower(), and ModifyPower().

Referenced by AuraEffect::HandleAuraModIncreaseEnergyPercent().

◆ ModifyRedirectThreat()

void Unit::ModifyRedirectThreat ( int32  amount)
inline
void ModifyThreatPct(int32 amount)
Definition: ThreatMgr.h:307

References _redirectThreatInfo, and RedirectThreatInfo::ModifyThreatPct().

Referenced by spell_warr_vigilance::HandleAfterApply().

◆ ModSpellCastTime()

void Unit::ModSpellCastTime ( SpellInfo const *  spellProto,
int32 castTime,
Spell spell = nullptr 
)
Todo:
:(MadAgos) Eventually check and delete the bool argument
15075{
15076 if (!spellInfo || castTime < 0)
15077 return;
15078
15079 if (spellInfo->IsChanneled() && spellInfo->HasAura(SPELL_AURA_MOUNTED))
15080 return;
15081
15082 // called from caster
15083 if (Player* modOwner = GetSpellModOwner())
15085 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell, bool(modOwner != this && !IsPet()));
15086
15087 switch (spellInfo->DmgClass)
15088 {
15090 if (spellInfo->AttributesEx5 & SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC) // required double check
15091 castTime = int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
15092 else if (spellInfo->SpellVisual[0] == 3881 && HasAura(67556)) // cooking with Chef Hat.
15093 castTime = 500;
15094 break;
15096 break; // no known cases
15098 castTime = CanInstantCast() ? 0 : int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
15099 break;
15101 castTime = int32(float(castTime) * m_modAttackSpeedPct[RANGED_ATTACK]);
15102 break;
15103 default:
15104 break;
15105 }
15106}
@ SPELLMOD_CASTING_TIME
Definition: SpellDefines.h:86
@ SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC
Definition: SharedDefines.h:591
bool CanInstantCast() const
Definition: Unit.h:1508

References SpellInfo::AttributesEx5, CanInstantCast(), SpellInfo::DmgClass, Object::GetFloatValue(), GetSpellModOwner(), SpellInfo::HasAura(), HasAura(), SpellInfo::Id, SpellInfo::IsChanneled(), IsPet(), m_modAttackSpeedPct, RANGED_ATTACK, SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC, SPELL_AURA_MOUNTED, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLMOD_CASTING_TIME, SpellInfo::SpellVisual, and UNIT_MOD_CAST_SPEED.

Referenced by SpellInfo::CalcCastTime().

◆ ModSpellDuration()

int32 Unit::ModSpellDuration ( SpellInfo const *  spellProto,
Unit const *  target,
int32  duration,
bool  positive,
uint32  effectMask 
)
14975{
14976 // don't mod permanent auras duration
14977 if (duration < 0)
14978 return duration;
14979
14980 // some auras are not affected by duration modifiers
14981 if (spellProto->HasAttribute(SPELL_ATTR7_NO_TARGET_DURATION_MOD))
14982 return duration;
14983
14984 // cut duration only of negative effects
14985 // xinef: also calculate self casts, spell can be reflected for example
14986 if (!positive)
14987 {
14988 int32 mechanic = spellProto->GetSpellMechanicMaskByEffectMask(effectMask);
14989
14990 int32 durationMod;
14991 int32 durationMod_always = 0;
14992 int32 durationMod_not_stack = 0;
14993
14994 for (uint8 i = 1; i <= MECHANIC_ENRAGED; ++i)
14995 {
14996 if (!(mechanic & 1 << i))
14997 continue;
14998
14999 // Xinef: spells affecting movement imparing effects should not reduce duration if disoriented mechanic is present
15000 if (i == MECHANIC_SNARE && (mechanic & (1 << MECHANIC_DISORIENTED)))
15001 continue;
15002
15003 // Find total mod value (negative bonus)
15004 int32 new_durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD, i);
15005 // Find max mod (negative bonus)
15006 int32 new_durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, i);
15007 // Check if mods applied before were weaker
15008 if (new_durationMod_always < durationMod_always)
15009 durationMod_always = new_durationMod_always;
15010 if (new_durationMod_not_stack < durationMod_not_stack)
15011 durationMod_not_stack = new_durationMod_not_stack;
15012 }
15013
15014 // Select strongest negative mod
15015 if (durationMod_always > durationMod_not_stack)
15016 durationMod = durationMod_not_stack;
15017 else
15018 durationMod = durationMod_always;
15019
15020 if (durationMod != 0)
15021 AddPct(duration, durationMod);
15022
15023 // there are only negative mods currently
15024 durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, spellProto->Dispel);
15025 durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, spellProto->Dispel);
15026
15027 durationMod = 0;
15028 if (durationMod_always > durationMod_not_stack)
15029 durationMod += durationMod_not_stack;
15030 else
15031 durationMod += durationMod_always;
15032
15033 if (durationMod != 0)
15034 AddPct(duration, durationMod);
15035 }
15036 else
15037 {
15038 // else positive mods here, there are no currently
15039 // when there will be, change GetTotalAuraModifierByMiscValue to GetTotalPositiveAuraModifierByMiscValue
15040 }
15041
15042 // Glyphs which increase duration of selfcasted buffs
15043 if (target == this)
15044 {
15045 switch (spellProto->SpellFamilyName)
15046 {
15047 case SPELLFAMILY_DRUID:
15048 if (spellProto->SpellFamilyFlags[0] & 0x100)
15049 {
15050 // Glyph of Thorns
15051 if (AuraEffect* aurEff = GetAuraEffect(57862, 0))
15052 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15053 }
15054 break;
15056 if ((spellProto->SpellFamilyFlags[0] & 0x00000002) && spellProto->SpellIconID == 298)
15057 {
15058 // Glyph of Blessing of Might
15059 if (AuraEffect* aurEff = GetAuraEffect(57958, 0))
15060 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15061 }
15062 else if ((spellProto->SpellFamilyFlags[0] & 0x00010000) && spellProto->SpellIconID == 306)
15063 {
15064 // Glyph of Blessing of Wisdom
15065 if (AuraEffect* aurEff = GetAuraEffect(57979, 0))
15066 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15067 }
15068 break;
15069 }
15070 }
15071 return std::max(duration, 0);
15072}
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK
Definition: SpellAuraDefines.h:309
@ SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK
Definition: SpellAuraDefines.h:297
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL
Definition: SpellAuraDefines.h:308
@ SPELL_AURA_MECHANIC_DURATION_MOD
Definition: SpellAuraDefines.h:295
@ SPELL_ATTR7_NO_TARGET_DURATION_MOD
Definition: SharedDefines.h:653
@ MECHANIC_ENRAGED
Definition: SharedDefines.h:1367
@ MECHANIC_DISORIENTED
Definition: SharedDefines.h:1338
constexpr auto MINUTE
Definition: Common.h:47

References AddPct(), SpellInfo::Dispel, GetAuraEffect(), GetMaxNegativeAuraModifierByMiscValue(), SpellInfo::GetSpellMechanicMaskByEffectMask(), GetTotalAuraModifierByMiscValue(), SpellInfo::HasAttribute(), IN_MILLISECONDS, MECHANIC_DISORIENTED, MECHANIC_ENRAGED, MECHANIC_SNARE, MINUTE, SPELL_ATTR7_NO_TARGET_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, SPELLFAMILY_DRUID, SPELLFAMILY_PALADIN, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

Referenced by Spell::DoSpellHitOnUnit(), and Spell::EffectInterruptCast().

◆ MonsterMoveWithSpeed()

◆ Mount()

void Unit::Mount ( uint32  mount,
uint32  vehicleId = 0,
uint32  creatureEntry = 0 
)
13560{
13561 if (mount)
13563
13565
13566 if (Player* player = ToPlayer())
13567 {
13568 sScriptMgr->AnticheatSetUnderACKmount(player);
13569
13570 // mount as a vehicle
13571 if (VehicleId)
13572 {
13573 if (CreateVehicleKit(VehicleId, creatureEntry))
13574 {
13575 GetVehicleKit()->Reset();
13576
13577 // Send others that we now have a vehicle
13579 data << GetPackGUID();
13580 data << uint32(VehicleId);
13581 SendMessageToSet(&data, true);
13582
13584 player->GetSession()->SendPacket(&data);
13585
13586 // mounts can also have accessories
13588 }
13589 }
13590
13591 // unsummon pet
13592 Pet* pet = player->GetPet();
13593 if (pet)
13594 {
13596 // don't unsummon pet in arena but SetFlag UNIT_FLAG_STUNNED to disable pet's interface
13597 if (bg && bg->isArena())
13599 else
13600 player->UnsummonPetTemporaryIfAny();
13601 }
13602
13603 // xinef: if we have charmed npc, stun him also
13604 if (Unit* charm = player->GetCharm())
13605 if (charm->IsCreature())
13606 charm->SetUnitFlag(UNIT_FLAG_STUNNED);
13607
13608 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13609 data << GetPackGUID();
13610 data << uint32(GameTime::GetGameTime().count()); // Packet counter
13611 data << player->GetCollisionHeight();
13612 player->GetSession()->SendPacket(&data);
13613 }
13614
13616}
@ AURA_INTERRUPT_FLAG_MOUNT
Definition: SpellDefines.h:60
bool isArena() const
Definition: Battleground.h:404
bool CreateVehicleKit(uint32 id, uint32 creatureEntry)
Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
Definition: Unit.cpp:18812
void Reset(bool evading=false)
Definition: Vehicle.cpp:120
void InstallAllAccessories(bool evading)
Definition: Vehicle.cpp:87

References AURA_INTERRUPT_FLAG_MOUNT, CreateVehicleKit(), Player::GetBattleground(), GetCharm(), GameTime::GetGameTime(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), Vehicle::InstallAllAccessories(), Battleground::isArena(), RemoveAurasWithInterruptFlags(), Vehicle::Reset(), WorldObject::SendMessageToSet(), SetUInt32Value(), SetUnitFlag(), SMSG_MOVE_SET_COLLISION_HGT, SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, and UNIT_FLAG_STUNNED.

Referenced by AuraEffect::HandleAuraMounted(), spell_mount_check_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyMountCommand(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::InitializeAI(), boss_captain_skarloc::InitializeAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::JustRespawned(), Creature::LoadCreaturesAddon(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_scarlet_courier::npc_scarlet_courierAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_mandokir::boss_mandokirAI::Reset(), and WorldSession::SendDoFlight().

◆ NearTeleportTo() [1/2]

void Unit::NearTeleportTo ( float  x,
float  y,
float  z,
float  orientation,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19815{
19816 DisableSpline();
19817 if (IsPlayer())
19818 ToPlayer()->TeleportTo(GetMapId(), x, y, z, orientation, TELE_TO_NOT_LEAVE_COMBAT | (removeTransport ? 0 : TELE_TO_NOT_LEAVE_TRANSPORT) | TELE_TO_NOT_UNSUMMON_PET | (casting ? TELE_TO_SPELL : 0) | (vehicleTeleport ? TELE_TO_NOT_LEAVE_VEHICLE : 0) | (withPet ? TELE_TO_WITH_PET : 0));
19819 else
19820 {
19821 Position pos = {x, y, z, orientation};
19822 SendTeleportPacket(pos);
19823 UpdatePosition(x, y, z, orientation, true);
19826 }
19827}
@ TELE_TO_WITH_PET
Definition: Player.h:823
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition: Player.h:822
@ TELE_TO_SPELL
Definition: Player.h:821
@ TELE_TO_NOT_LEAVE_COMBAT
Definition: Player.h:819
@ TELE_TO_NOT_UNSUMMON_PET
Definition: Player.h:820
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition: Player.h:818
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition: Player.cpp:1345
void SendTeleportPacket(Position &pos)
Definition: Unit.cpp:19836
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition: Unit.cpp:19227
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition: Unit.cpp:19855
void ReinitializeMovement()
Definition: MotionMaster.cpp:939

References DisableSpline(), WorldLocation::GetMapId(), GetMotionMaster(), Object::IsPlayer(), MotionMaster::ReinitializeMovement(), SendTeleportPacket(), TELE_TO_NOT_LEAVE_COMBAT, TELE_TO_NOT_LEAVE_TRANSPORT, TELE_TO_NOT_LEAVE_VEHICLE, TELE_TO_NOT_UNSUMMON_PET, TELE_TO_SPELL, TELE_TO_WITH_PET, Player::TeleportTo(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdatePosition().

◆ NearTeleportTo() [2/2]

void Unit::NearTeleportTo ( Position pos,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19810{
19811 NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), casting, vehicleTeleport, withPet, removeTransport);
19812}
void NearTeleportTo(Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
Definition: Unit.cpp:19809

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and NearTeleportTo().

Referenced by boss_viscidus::DamageTaken(), npc_madrigosa::DoAction(), npc_akama_illidan::DoAction(), Spell::EffectLeap(), Spell::EffectResurrectPet(), Spell::EffectStuck(), Spell::EffectSummonPet(), Spell::EffectTeleportUnits(), Spell::EffectTeleUnitsFaceCaster(), npc_giant_claw_tentacle::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), BattlegroundBE::HandleAreaTrigger(), BattlegroundDS::HandleAreaTrigger(), BattlegroundNA::HandleAreaTrigger(), BattlegroundRL::HandleAreaTrigger(), BattlegroundRV::HandleAreaTrigger(), spell_moroes_vanish::HandleDummy(), spell_class_call_handler::HandleOnHitRogue(), npc_echo_of_medivh::HandlePieceJustDied(), BattlegroundBE::HandlePlayerUnderMap(), BattlegroundDS::HandlePlayerUnderMap(), BattlegroundNA::HandlePlayerUnderMap(), BattlegroundRL::HandlePlayerUnderMap(), BattlegroundRV::HandlePlayerUnderMap(), npc_pet_mage_mirror_image::InitializeAI(), boss_urom::boss_uromAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_grandmaster_vorpil::JustEngagedWith(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), NearTeleportTo(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_chesspiece::OnCharmed(), npc_vh_sinclari::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), npc_chesspiece::Reset(), boss_gothik::boss_gothikAI::Reset(), Map::ScriptsProcess(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), boss_urom::boss_uromAI::SpellHit(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), npc_pos_leader_second::npc_pos_leader_secondAI::SpellHitTarget(), boss_cyanigosa::boss_cyanigosaAI::SpellHitTarget(), BattlegroundRV::TeleportUnitToNewZ(), Vehicle::TeleportVehicle(), npc_doomfire_spirit::TryTeleportInDirection(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), and npc_minigob_manabonk::UpdateAI().

◆ OutDebugInfo()

void Unit::OutDebugInfo ( ) const
20065{
20066 LOG_ERROR("entities.unit", "Unit::OutDebugInfo");
20067 LOG_INFO("entities.unit", "GUID {}, name {}", GetGUID().ToString(), GetName());
20068 LOG_INFO("entities.unit", "OwnerGUID {}, MinionGUID {}, CharmerGUID {}, CharmedGUID {}",
20070 LOG_INFO("entities.unit", "In world {}, unit type mask {}", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask);
20071 if (IsInWorld())
20072 LOG_INFO("entities.unit", "Mapid {}", GetMapId());
20073
20074 LOG_INFO("entities.unit", "Summon Slot: ");
20075 for (uint32 i = 0; i < MAX_SUMMON_SLOT; ++i)
20076 LOG_INFO("entities.unit", "{}, ", m_SummonSlot[i].ToString());
20077 LOG_INFO("server.loading", " ");
20078
20079 LOG_INFO("entities.unit", "Controlled List: ");
20080 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20081 LOG_INFO("entities.unit", "{}, ", (*itr)->GetGUID().ToString());
20082 LOG_INFO("server.loading", " ");
20083
20084 LOG_INFO("entities.unit", "Aura List: ");
20085 for (AuraApplicationMap::const_iterator itr = m_appliedAuras.begin(); itr != m_appliedAuras.end(); ++itr)
20086 LOG_INFO("entities.unit", "{}, ", itr->first);
20087 LOG_INFO("server.loading", " ");
20088
20089 if (IsVehicle())
20090 {
20091 LOG_INFO("entities.unit", "Passenger List: ");
20092 for (SeatMap::iterator itr = GetVehicleKit()->Seats.begin(); itr != GetVehicleKit()->Seats.end(); ++itr)
20093 if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.Passenger.Guid))
20094 LOG_INFO("entities.unit", "{}, ", passenger->GetGUID().ToString());
20095 LOG_INFO("server.loading", " ");
20096 }
20097
20098 if (GetVehicle())
20099 LOG_INFO("entities.unit", "On vehicle {}.", GetVehicleBase()->GetEntry());
20100}
Seats
Definition: boss_flame_leviathan.cpp:168

References GetCharmerGUID(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), WorldLocation::GetMapId(), GetMinionGUID(), WorldObject::GetName(), GetOwnerGUID(), ObjectAccessor::GetUnit(), GetVehicle(), GetVehicleBase(), GetVehicleKit(), Object::IsInWorld(), IsVehicle(), LOG_ERROR, LOG_INFO, m_appliedAuras, m_Controlled, m_SummonSlot, m_unitTypeMask, MAX_SUMMON_SLOT, and Position::ToString().

Referenced by SetMinion().

◆ PatchValuesUpdate()

void Unit::PatchValuesUpdate ( ByteBuffer valuesUpdateBuf,
BuildValuesCachePosPointers posPointers,
Player target 
)
private
20707{
20708 Creature const* creature = ToCreature();
20709
20710 // UNIT_NPC_FLAGS
20711 if (creature && posPointers.UnitNPCFlagsPos >= 0)
20712 {
20713 uint32 appendValue = m_uint32Values[UNIT_NPC_FLAGS];
20714
20715 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && appendValue & UNIT_NPC_FLAG_FLIGHTMASTER)
20716 appendValue |= UNIT_NPC_FLAG_GOSSIP; // flight masters need NPC gossip flag to show instant flight toggle option
20717
20718 if (!target->CanSeeSpellClickOn(creature))
20719 appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK;
20720
20721 if (!target->CanSeeVendor(creature))
20722 appendValue &= ~UNIT_NPC_FLAG_VENDOR_MASK;
20723
20724 if (!creature->IsValidTrainerForPlayer(target, &appendValue))
20725 appendValue &= ~UNIT_NPC_FLAG_TRAINER;
20726
20727 valuesUpdateBuf.put(posPointers.UnitNPCFlagsPos, appendValue);
20728 }
20729
20730 // UNIT_FIELD_AURASTATE
20731 if (posPointers.UnitFieldAuraStatePos >= 0)
20732 valuesUpdateBuf.put(posPointers.UnitFieldAuraStatePos, uint32(BuildAuraStateUpdateForTarget(target)));
20733
20734 // UNIT_FIELD_FLAGS
20735 if (posPointers.UnitFieldFlagsPos >= 0)
20736 {
20737 uint32 appendValue = m_uint32Values[UNIT_FIELD_FLAGS];
20738 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20739 appendValue &= ~UNIT_FLAG_NOT_SELECTABLE;
20740
20741 valuesUpdateBuf.put(posPointers.UnitFieldFlagsPos, appendValue);
20742 }
20743
20744 // UNIT_FIELD_DISPLAYID
20745 // Use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures.
20746 if (posPointers.UnitFieldDisplayPos >= 0)
20747 {
20749 if (creature)
20750 {
20751 CreatureTemplate const* cinfo = creature->GetCreatureTemplate();
20752
20753 // this also applies for transform auras
20754 if (SpellInfo const* transform = sSpellMgr->GetSpellInfo(getTransForm()))
20755 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
20756 if (transform->Effects[i].IsAura(SPELL_AURA_TRANSFORM))
20757 if (CreatureTemplate const* transformInfo = sObjectMgr->GetCreatureTemplate(transform->Effects[i].MiscValue))
20758 {
20759 cinfo = transformInfo;
20760 break;
20761 }
20762
20764 {
20765 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20766 displayId = cinfo->GetFirstVisibleModel()->CreatureDisplayID;
20767 else
20768 displayId = cinfo->GetFirstInvisibleModel()->CreatureDisplayID;
20769 }
20770 }
20771
20772 valuesUpdateBuf.put(posPointers.UnitFieldDisplayPos, uint32(displayId));
20773 }
20774
20775 // UNIT_DYNAMIC_FLAGS
20776 // Hide lootable animation for unallowed players.
20777 if (posPointers.UnitDynamicFlagsPos >= 0)
20778 {
20780
20781 if (creature)
20782 {
20783 if (creature->hasLootRecipient())
20784 {
20785 dynamicFlags |= UNIT_DYNFLAG_TAPPED;
20786 if (creature->isTappedBy(target))
20787 dynamicFlags |= UNIT_DYNFLAG_TAPPED_BY_PLAYER;
20788 }
20789
20790 if (!target->isAllowedToLoot(creature))
20791 dynamicFlags &= ~UNIT_DYNFLAG_LOOTABLE;
20792 }
20793
20794 // unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras
20795 if (dynamicFlags & UNIT_DYNFLAG_TRACK_UNIT)
20797 dynamicFlags &= ~UNIT_DYNFLAG_TRACK_UNIT;
20798
20799 valuesUpdateBuf.put(posPointers.UnitDynamicFlagsPos, dynamicFlags);
20800 }
20801
20802 // UNIT_FIELD_BYTES_2
20803 if (posPointers.UnitFieldBytes2Pos >= 0)
20804 {
20805 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
20806 {
20808 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
20809 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
20810 // Allow targetting opposite faction in party when enabled in config
20811 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8))); // this flag is at uint8 offset 1 !!
20812 }// pussywizard / Callmephil
20813 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
20814 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
20815 {
20816 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & 0xFFFFF2FF)); // clear UNIT_BYTE2_FLAG_PVP, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY
20817 }
20818 }
20819
20820 // UNIT_FIELD_FACTIONTEMPLATE
20821 if (posPointers.UnitFieldFactionTemplatePos >= 0)
20822 {
20823 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
20824 {
20826 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
20827 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
20828 // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work)
20829 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20830 }// pussywizard / Callmephil
20831 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
20832 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
20833 {
20834 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20835 }
20836 else if (target->IsGMSpectator() && IsControlledByPlayer())
20837 {
20838 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20839 }
20840 }
20841
20842 sScriptMgr->OnPatchValuesUpdate(this, valuesUpdateBuf, posPointers, target);
20843}
@ CREATURE_FLAG_EXTRA_TRIGGER
Definition: CreatureData.h:52
@ CONFIG_INSTANT_TAXI
Definition: WorldConfig.h:340
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition: WorldConfig.h:34
@ UNIT_DYNFLAG_TRACK_UNIT
Definition: SharedDefines.h:3372
bool IsValidTrainerForPlayer(Player *player, uint32 *npcFlags=nullptr) const
Definition: Creature.cpp:1276
bool isTappedBy(Player const *player) const
Definition: Creature.cpp:1392
uint32 CreatureDisplayID
Definition: CreatureData.h:179
CreatureModel const * GetFirstInvisibleModel() const
Definition: Creature.cpp:162
CreatureModel const * GetFirstVisibleModel() const
Definition: Creature.cpp:172
bool isAllowedToLoot(Creature const *creature)
Definition: PlayerStorage.cpp:5620
bool CanSeeVendor(Creature const *creature) const
Definition: Player.cpp:14328
bool IsGMSpectator() const
Definition: Player.h:1165
bool IsSpectator() const
Definition: Player.h:2578
bool CanSeeSpellClickOn(Creature const *creature) const
Definition: Player.cpp:14305
uint32 BuildAuraStateUpdateForTarget(Unit *target) const
Definition: Unit.cpp:10631
int32 UnitFieldFlagsPos
Definition: UnitUtils.h:99
int32 UnitFieldDisplayPos
Definition: UnitUtils.h:100
int32 UnitDynamicFlagsPos
Definition: UnitUtils.h:101
int32 UnitFieldAuraStatePos
Definition: UnitUtils.h:98
int32 UnitFieldFactionTemplatePos
Definition: UnitUtils.h:103
int32 UnitFieldBytes2Pos
Definition: UnitUtils.h:102
int32 UnitNPCFlagsPos
Definition: UnitUtils.h:97
bool IsGMAccount() const
Definition: WorldSession.cpp:205
void put(std::size_t pos, T value)
Definition: ByteBuffer.h:137

References BuildAuraStateUpdateForTarget(), Player::CanSeeSpellClickOn(), Player::CanSeeVendor(), CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP, CONFIG_INSTANT_TAXI, CREATURE_FLAG_EXTRA_TRIGGER, CreatureModel::CreatureDisplayID, WorldObject::FindMap(), Creature::GetCreatureTemplate(), GetFaction(), GetFactionTemplateEntry(), CreatureTemplate::GetFirstInvisibleModel(), CreatureTemplate::GetFirstVisibleModel(), Object::GetGUID(), Player::GetSession(), getTransForm(), HasAuraTypeWithCaster(), CreatureTemplate::HasFlagsExtra(), Creature::hasLootRecipient(), Player::isAllowedToLoot(), Map::IsBattleArena(), IsControlledByPlayer(), FactionTemplateEntry::IsFriendlyTo(), Player::IsGameMaster(), WorldSession::IsGMAccount(), Player::IsGMSpectator(), IsInRaidWith(), Player::IsSpectator(), Creature::isTappedBy(), Creature::IsValidTrainerForPlayer(), Object::m_uint32Values, MAX_SPELL_EFFECTS, ByteBuffer::put(), sObjectMgr, SPELL_AURA_MOD_STALKED, SPELL_AURA_TRANSFORM, sScriptMgr, sSpellMgr, sWorld, Object::ToCreature(), UNIT_BYTE2_FLAG_SANCTUARY, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_DYNFLAG_TRACK_UNIT, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FLAGS, UNIT_NPC_FLAG_FLIGHTMASTER, UNIT_NPC_FLAG_GOSSIP, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, and BuildValuesCachePosPointers::UnitNPCFlagsPos.

Referenced by BuildValuesUpdate().

◆ PauseMovement()

void Unit::PauseMovement ( uint32  timer = 0,
uint8  slot = 0 
)
virtual

Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.

16753{
16754 if (slot >= MAX_MOTION_SLOT)
16755 return;
16756
16757 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16758 movementGenerator->Pause(timer);
16759
16760 StopMoving();
16761}
@ MAX_MOTION_SLOT
Definition: MotionMaster.h:66
void StopMoving()
Definition: Unit.cpp:16733
Definition: MovementGenerator.h:28

References GetMotionMaster(), MAX_MOTION_SLOT, and StopMoving().

Referenced by WorldSession::HandleBattlemasterHelloOpcode(), WorldSession::HandleGossipHelloOpcode(), spell_chapter5_return_to_capital::HandleHit(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::SendListInventory(), boss_shade_of_aran::SetGUID(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), and npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI().

◆ PetSpellFail()

void Unit::PetSpellFail ( SpellInfo const *  spellInfo,
Unit target,
uint32  result 
)
20193{
20194 CharmInfo* charmInfo = GetCharmInfo();
20195 if (!charmInfo || !IsCreature())
20196 return;
20197
20198 if ((sDisableMgr->IsPathfindingEnabled(GetMap()) || result != SPELL_FAILED_LINE_OF_SIGHT) && target)
20199 {
20200 if ((result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE) || !ToCreature()->HasReactState(REACT_PASSIVE))
20201 if (Unit* owner = GetOwner())
20202 {
20203 if (spellInfo->IsPositive() && IsFriendlyTo(target))
20204 {
20205 AttackStop();
20206 charmInfo->SetIsAtStay(false);
20207 charmInfo->SetIsCommandAttack(true);
20208 charmInfo->SetIsReturning(false);
20209 charmInfo->SetIsFollowing(false);
20210
20211 GetMotionMaster()->MoveFollow(target, PET_FOLLOW_DIST, rand_norm() * 2 * M_PI);
20212 }
20213 else if (owner->IsValidAttackTarget(target))
20214 {
20215 AttackStop();
20216 charmInfo->SetIsAtStay(false);
20217 charmInfo->SetIsCommandAttack(true);
20218 charmInfo->SetIsReturning(false);
20219 charmInfo->SetIsFollowing(false);
20220
20221 if (!ToCreature()->HasReactState(REACT_PASSIVE))
20222 ToCreature()->AI()->AttackStart(target);
20223 else
20224 GetMotionMaster()->MoveChase(target);
20225 }
20226 }
20227
20228 // can be extended in future
20229 if (result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE)
20230 {
20231 charmInfo->SetForcedSpell(spellInfo->IsPositive() ? -int32(spellInfo->Id) : spellInfo->Id);
20232 charmInfo->SetForcedTargetGUID(target->GetGUID());
20233 }
20234 else
20235 {
20236 charmInfo->SetForcedSpell(0);
20238 }
20239 }
20240}
#define PET_FOLLOW_DIST
Definition: PetDefines.h:205
#define sDisableMgr
Definition: DisableMgr.h:88
@ SPELL_FAILED_OUT_OF_RANGE
Definition: SharedDefines.h:1057
@ SPELL_FAILED_LINE_OF_SIGHT
Definition: SharedDefines.h:1007
virtual void AttackStart(Unit *)
Definition: UnitAI.cpp:27
void SetIsAtStay(bool val)
Definition: CharmInfo.cpp:365
void SetIsFollowing(bool val)
Definition: CharmInfo.cpp:375
void SetIsReturning(bool val)
Definition: CharmInfo.cpp:385
void SetForcedSpell(uint32 id)
Definition: CharmInfo.h:177
void SetForcedTargetGUID(ObjectGuid guid=ObjectGuid::Empty)
Definition: CharmInfo.h:179
void SetIsCommandAttack(bool val)
Definition: CharmInfo.cpp:303
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:313
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true, bool inheritSpeed=true)
The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:444

References Creature::AI(), UnitAI::AttackStart(), AttackStop(), ObjectGuid::Empty, GetCharmInfo(), Object::GetGUID(), WorldObject::GetMap(), GetMotionMaster(), GetOwner(), SpellInfo::Id, Object::IsCreature(), IsFriendlyTo(), SpellInfo::IsPositive(), MotionMaster::MoveChase(), MotionMaster::MoveFollow(), PET_FOLLOW_DIST, rand_norm(), REACT_PASSIVE, sDisableMgr, CharmInfo::SetForcedSpell(), CharmInfo::SetForcedTargetGUID(), CharmInfo::SetIsAtStay(), CharmInfo::SetIsCommandAttack(), CharmInfo::SetIsFollowing(), CharmInfo::SetIsReturning(), SPELL_FAILED_LINE_OF_SIGHT, SPELL_FAILED_OUT_OF_RANGE, and Object::ToCreature().

Referenced by WorldSession::HandlePetActionHelper(), and WorldSession::HandlePetCastSpellOpcode().

◆ ProcDamageAndSpell()

void Unit::ProcDamageAndSpell ( Unit actor,
Unit victim,
uint32  procAttacker,
uint32  procVictim,
uint32  procEx,
uint32  amount,
WeaponAttackType  attType = BASE_ATTACK,
SpellInfo const *  procSpellInfo = nullptr,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
static
6475{
6476 // Not much to do if no flags are set.
6477 if (procAttacker && actor)
6478 actor->ProcDamageAndSpellFor(false, victim, procAttacker, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6479 // Now go on with a victim's events'n'auras
6480 // Not much to do if no flags are set or there is no victim
6481 if (victim && victim->IsAlive() && procVictim)
6482 victim->ProcDamageAndSpellFor(true, actor, procVictim, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6483}

References IsAlive(), and ProcDamageAndSpellFor().

Referenced by Spell::_cast(), Spell::_handle_finish_phase(), AttackerStateUpdate(), Spell::DoAllEffectOnTarget(), ReflectEvent::Execute(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and Kill().

◆ ProcDamageAndSpellFor()

void Unit::ProcDamageAndSpellFor ( bool  isVictim,
Unit target,
uint32  procFlag,
uint32  procExtra,
WeaponAttackType  attType,
SpellInfo const *  procSpellInfo,
uint32  damage,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
16142{
16143 // Player is loaded now - do not allow passive spell casts to proc
16144 if (IsPlayer() && ToPlayer()->GetSession()->PlayerLoading())
16145 return;
16146 // For melee/ranged based attack need update skills and set some Aura states if victim present
16147 if (procFlag & MELEE_BASED_TRIGGER_MASK && target && procPhase == PROC_SPELL_PHASE_HIT)
16148 {
16149 // Xinef: Shaman in ghost wolf form cant proc anything melee based
16150 if (!isVictim && GetShapeshiftForm() == FORM_GHOSTWOLF)
16151 return;
16152
16153 // Update skills here for players
16154 // only when you are not fighting other players or their pets/totems (pvp)
16155 if (IsPlayer() && !target->IsCharmedOwnedByPlayerOrPlayer())
16156 {
16157 // On melee based hit/miss/resist/parry/dodge need to update skill (for victim and attacker)
16159 {
16160 ToPlayer()->UpdateCombatSkills(target, attType, isVictim, procSpell ? procSpell->m_weaponItem : nullptr);
16161 }
16162 // Update defence if player is victim and we block - TODO: confirm that blocked attacks only have a chance to increase defence skill
16163 else if (isVictim && procExtra & (PROC_EX_BLOCK))
16164 {
16165 ToPlayer()->UpdateCombatSkills(target, attType, true);
16166 }
16167 }
16168 // If exist crit/parry/dodge/block need update aura state (for victim and attacker)
16170 {
16171 // for victim
16172 if (isVictim)
16173 {
16174 // if victim and dodge attack
16175 if (procExtra & PROC_EX_DODGE)
16176 {
16177 // Update AURA_STATE on dodge
16178 if (!IsClass(CLASS_ROGUE, CLASS_CONTEXT_ABILITY_REACTIVE)) // skip Rogue Riposte
16179 {
16182 }
16183 }
16184 // if victim and parry attack
16185 if (procExtra & PROC_EX_PARRY)
16186 {
16187 // For Hunters only Counterattack (skip Mongoose bite)
16189 {
16192 }
16193 else
16194 {
16197 }
16198 }
16199 // if and victim block attack
16200 if (procExtra & PROC_EX_BLOCK)
16201 {
16204 }
16205 }
16206 else // For attacker
16207 {
16208 // Overpower on victim dodge
16209 if (procExtra & PROC_EX_DODGE)
16210 {
16212 {
16213 AddComboPoints(target, 1);
16215 }
16216 }
16217
16218 // Wolverine Bite
16219 if ((procExtra & PROC_HIT_CRITICAL) && IsHunterPet())
16220 {
16221 AddComboPoints(target, 1);
16223 }
16224 }
16225 }
16226 }
16227
16228 Unit* actor = isVictim ? target : this;
16229 Unit* actionTarget = !isVictim ? target : this;
16230
16231 ProcEventInfo eventInfo = ProcEventInfo(actor, actionTarget, target, procFlag, 0, procPhase, procExtra, procSpell, damageInfo, healInfo, procAura, procAuraEffectIndex);
16232
16233 ProcTriggeredList procTriggered;
16234 // Fill procTriggered list
16235 for (AuraApplicationMap::const_iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16236 {
16237 // Do not allow auras to proc from effect triggered by itself
16238 if (procAura && procAura->Id == itr->first)
16239 continue;
16240
16241 // Xinef: Generic Item Equipment cooldown, -1 is a special marker
16242 if (itr->second->GetBase()->GetCastItemGUID() && HasSpellItemCooldown(itr->first, uint32(-1)))
16243 continue;
16244
16245 ProcTriggeredData triggerData(itr->second->GetBase());
16246 // Defensive procs are active on absorbs (so absorption effects are not a hindrance)
16247 bool active = damage || (procExtra & PROC_EX_BLOCK && isVictim);
16248 if (isVictim)
16249 procExtra &= ~PROC_EX_INTERNAL_REQ_FAMILY;
16250
16251 SpellInfo const* spellProto = itr->second->GetBase()->GetSpellInfo();
16252
16253 // only auras that have trigger spell should proc from fully absorbed damage
16254 if (procExtra & PROC_EX_ABSORB && isVictim)
16255 if (damage || spellProto->Effects[EFFECT_0].TriggerSpell || spellProto->Effects[EFFECT_1].TriggerSpell || spellProto->Effects[EFFECT_2].TriggerSpell)
16256 active = true;
16257
16258 // xinef: fix spell procing from damaging / healing casts if spell has DoT / HoT effect only
16259 // only player spells are taken into account
16260 if (!active && !isVictim && !(procFlag & PROC_FLAG_DONE_PERIODIC) && procSpellInfo && procSpellInfo->SpellFamilyName && (procSpellInfo->HasAura(SPELL_AURA_PERIODIC_DAMAGE) || procSpellInfo->HasAura(SPELL_AURA_PERIODIC_HEAL)))
16261 active = true;
16262
16263 // AuraScript Hook
16264 if (!triggerData.aura->CallScriptCheckProcHandlers(itr->second, eventInfo))
16265 {
16266 continue;
16267 }
16268
16269 bool isTriggeredAtSpellProcEvent = IsTriggeredAtSpellProcEvent(target, triggerData.aura, attType, isVictim, active, triggerData.spellProcEvent, eventInfo);
16270
16271 // AuraScript Hook
16272 if (!triggerData.aura->CallScriptAfterCheckProcHandlers(itr->second, eventInfo, isTriggeredAtSpellProcEvent))
16273 {
16274 continue;
16275 }
16276
16277 // do checks using conditions table
16278 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL_PROC, spellProto->Id);
16279 ConditionSourceInfo condInfo = ConditionSourceInfo(eventInfo.GetActor(), eventInfo.GetActionTarget());
16280 if (!sConditionMgr->IsObjectMeetToConditions(condInfo, conditions))
16281 {
16282 continue;
16283 }
16284
16285 bool hasTriggeredProc = false;
16286 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
16287 {
16288 if (itr->second->HasEffect(i))
16289 {
16290 AuraEffect* aurEff = itr->second->GetBase()->GetEffect(i);
16291
16292 // Skip this auras
16293 if (isNonTriggerAura[aurEff->GetAuraType()])
16294 continue;
16295
16296 // If not trigger by default and spellProcEvent == nullptr - skip
16297 if (!isTriggerAura[aurEff->GetAuraType()] && !triggerData.spellProcEvent)
16298 continue;
16299
16300 switch (aurEff->GetAuraType())
16301 {
16304 case SPELL_AURA_DUMMY:
16306 if (uint32 triggerSpellId = aurEff->GetSpellInfo()->Effects[i].TriggerSpell)
16307 {
16308 triggerData.triggerSpelId[i] = triggerSpellId;
16309 hasTriggeredProc = true;
16310 }
16311 break;
16312 default:
16313 break;
16314 }
16315
16316 // Some spells must always trigger
16317 //if (isAlwaysTriggeredAura[aurEff->GetAuraType()])
16318 triggerData.effMask |= 1 << i;
16319 }
16320 }
16321
16322 if (triggerData.effMask)
16323 {
16324 // If there is aura that triggers another proc aura, make sure that the triggered one is going to be proccessed on top of it
16325 if (hasTriggeredProc)
16326 {
16327 bool proccessed = false;
16328 for (uint8 i = 0; i < EFFECT_ALL; ++i)
16329 {
16330 if (uint32 triggeredSpellId = triggerData.triggerSpelId[i])
16331 {
16332 auto iter = std::find(procTriggered.begin(), procTriggered.end(), triggeredSpellId);
16333 if (iter != procTriggered.end())
16334 {
16335 std::advance(iter, 1);
16336 procTriggered.insert(iter, triggerData);
16337 proccessed = true;
16338 break;
16339 }
16340 }
16341 }
16342
16343 if (!proccessed)
16344 {
16345 procTriggered.push_front(triggerData);
16346 }
16347 }
16348 else
16349 {
16350 procTriggered.push_front(triggerData);
16351 }
16352 }
16353 }
16354
16355 // Nothing found
16356 if (procTriggered.empty())
16357 return;
16358
16359 // Note: must SetCantProc(false) before return
16361 SetCantProc(true);
16362
16363 // Handle effects proceed this time
16364 for (ProcTriggeredList::const_iterator i = procTriggered.begin(); i != procTriggered.end(); ++i)
16365 {
16366 // look for aura in auras list, it may be removed while proc event processing
16367 if (i->aura->IsRemoved())
16368 continue;
16369
16370 bool useCharges = i->aura->IsUsingCharges();
16371 // no more charges to use, prevent proc
16372 if (useCharges && !i->aura->GetCharges())
16373 continue;
16374
16375 bool takeCharges = false;
16376 SpellInfo const* spellInfo = i->aura->GetSpellInfo();
16377
16378 AuraApplication* aurApp = i->aura->GetApplicationOfTarget(GetGUID());
16379
16380 bool prepare = i->aura->CallScriptPrepareProcHandlers(aurApp, eventInfo);
16381
16382 // For players set spell cooldown if need
16383 uint32 cooldown = 0;
16384 if (prepare && i->spellProcEvent && i->spellProcEvent->cooldown)
16385 cooldown = i->spellProcEvent->cooldown;
16386
16387 // Xinef: set cooldown for actual proc
16388 eventInfo.SetProcCooldown(cooldown);
16389
16390 // Note: must SetCantProc(false) before return
16392 SetCantProc(true);
16393
16394 bool handled = i->aura->CallScriptProcHandlers(aurApp, eventInfo);
16395
16396 // "handled" is needed as long as proc can be handled in multiple places
16397 if (!handled && HandleAuraProc(target, damage, i->aura, procSpellInfo, procFlag, procExtra, cooldown, &handled))
16398 {
16399 uint32 Id = i->aura->GetId();
16400 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), Id);
16401 takeCharges = true;
16402 }
16403
16404 if (!handled)
16405 for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
16406 {
16407 if (!(i->effMask & (1 << effIndex)))
16408 continue;
16409
16410 AuraEffect* triggeredByAura = i->aura->GetEffect(effIndex);
16411 ASSERT(triggeredByAura);
16412
16413 bool prevented = i->aura->CallScriptEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16414 if (prevented)
16415 {
16416 takeCharges = true;
16417 continue;
16418 }
16419
16420 switch (triggeredByAura->GetAuraType())
16421 {
16423 {
16424 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16425 // Don`t drop charge or add cooldown for not started trigger
16426 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16427 takeCharges = true;
16428 break;
16429 }
16431 {
16432 // target has to be valid
16433 if (!eventInfo.GetProcTarget())
16434 break;
16435
16436 triggeredByAura->HandleProcTriggerDamageAuraProc(aurApp, eventInfo); // this function is part of the new proc system
16437 takeCharges = true;
16438 break;
16439 }
16441 case SPELL_AURA_DUMMY:
16442 {
16443 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} dummy aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16444 if (HandleDummyAuraProc(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, eventInfo))
16445 takeCharges = true;
16446 break;
16447 }
16452 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, isVictim ? "a victim's" : "an attacker's", triggeredByAura->GetId());
16453 takeCharges = true;
16454 break;
16456 {
16457 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16458 if (HandleOverrideClassScriptAuraProc(target, damage, triggeredByAura, procSpellInfo, cooldown))
16459 takeCharges = true;
16460 break;
16461 }
16463 {
16464 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16465 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16466 if (damage > 0)
16467 {
16469 takeCharges = true;
16470 }
16471 break;
16472 }
16474 {
16475 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16476 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16477 HandleAuraRaidProcFromCharge(triggeredByAura);
16478 takeCharges = true;
16479 break;
16480 }
16482 {
16483 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16484
16485 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16486 takeCharges = true;
16487 break;
16488 }
16490 // Skip melee hits or instant cast spells
16491 // xinef: check channeled spells which are affected by haste also
16492 if (procSpellInfo && (procSpellInfo->SpellFamilyName || !IsPlayer()) &&
16493 (procSpellInfo->CalcCastTime() > 0 /*||
16494 (procSpell->IsChanneled() && procSpell->GetDuration() > 0 && (HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, procSpell) || procSpell->HasAttribute(SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC)))*/))
16495 takeCharges = true;
16496 break;
16498 // Skip Melee hits and spells ws wrong school
16499 if (procSpellInfo && (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16500 takeCharges = true;
16501 break;
16503 // Skip Melee hits and targets with magnet aura
16504 if (procSpellInfo && (triggeredByAura->GetBase()->GetUnitOwner()->ToUnit() == ToUnit())) // Magnet
16505 takeCharges = true;
16506 break;
16509 // Skip melee hits and spells ws wrong school or zero cost
16510 if (procSpellInfo &&
16511 (procSpellInfo->ManaCost != 0 || procSpellInfo->ManaCostPercentage != 0 || (procSpellInfo->SpellFamilyFlags[1] & 0x2)) && // Cost check, mutilate include
16512 (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16513 takeCharges = true;
16514 break;
16517 // Compare mechanic
16518 if (procSpellInfo && procSpellInfo->Mechanic == uint32(triggeredByAura->GetMiscValue()))
16519 takeCharges = true;
16520 break;
16522 // Compare casters
16523 if (target && triggeredByAura->GetCasterGUID() == target->GetGUID())
16524 takeCharges = true;
16525 break;
16526 // CC Auras which use their amount amount to drop
16527 // Are there any more auras which need this?
16533 {
16534 // Spell own direct damage at apply wont break the CC
16535 // Xinef: Or when the aura is at full duration (assume that such auras should be added at the end, skipping all damage procs etc.)
16536 if (procSpellInfo)
16537 if ((!i->aura->IsPermanent() && i->aura->GetDuration() == i->aura->GetMaxDuration()) || procSpellInfo->Id == triggeredByAura->GetId() ||
16538 procSpellInfo->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
16539 break;
16540
16541 // chargeable mods are breaking on hit
16542 if (useCharges)
16543 takeCharges = true;
16544 else if (triggeredByAura->GetAmount()) // aura must have amount
16545 {
16546 int32 damageLeft = triggeredByAura->GetAmount();
16547 // No damage left
16548 if (damageLeft < int32(damage))
16549 i->aura->Remove();
16550 else
16551 triggeredByAura->SetAmount(damageLeft - damage);
16552 }
16553 break;
16554 }
16556 if (procSpellInfo && procSpellInfo->Id == 20647) // hack for warriors execute, both dummy and damage spell are affected by ignore aurastate aura
16557 break;
16558 takeCharges = true;
16559 break;
16562 {
16563 if (triggeredByAura->GetSpellModifier())
16564 {
16565 // Do proc if mod is consumed by spell
16566 if (!procSpell || procSpell->m_appliedMods.find(i->aura) != procSpell->m_appliedMods.end())
16567 {
16568 takeCharges = true;
16569 }
16570 }
16571 break;
16572 }
16573 default:
16574 takeCharges = true;
16575 break;
16576 }
16577 i->aura->CallScriptAfterEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16578 }
16579 // Remove charge (aura can be removed by triggers)
16580 // xinef: take into account attribute6 of proc spell
16581 if (prepare && useCharges && takeCharges)
16582 if (!procSpellInfo || isVictim || !procSpellInfo->HasAttribute(SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES))
16583 i->aura->DropCharge();
16584
16585 i->aura->CallScriptAfterProcHandlers(aurApp, eventInfo);
16586
16588 SetCantProc(false);
16589 }
16590
16591 // Cleanup proc requirements
16593 SetCantProc(false);
16594}
@ PROC_HIT_CRITICAL
Definition: SpellMgr.h:253
#define MELEE_BASED_TRIGGER_MASK
Definition: SpellMgr.h:182
@ PROC_EX_INTERNAL_CANT_PROC
Definition: SpellMgr.h:218
@ PROC_FLAG_DONE_PERIODIC
Definition: SpellMgr.h:134
@ SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE
Definition: SpellAuraDefines.h:288
@ SPELL_AURA_ADD_PCT_MODIFIER
Definition: SpellAuraDefines.h:171
@ SPELL_AURA_OBS_MOD_POWER
Definition: SpellAuraDefines.h:84
@ SPELL_AURA_ADD_FLAT_MODIFIER
Definition: SpellAuraDefines.h:170
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
Definition: SpellAuraDefines.h:120
@ SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT
Definition: SpellAuraDefines.h:135
@ SPELL_AURA_MOD_POWER_COST_SCHOOL
Definition: SpellAuraDefines.h:136
@ SPELL_AURA_MECHANIC_IMMUNITY
Definition: SpellAuraDefines.h:140
@ SPELL_AURA_RAID_PROC_FROM_CHARGE
Definition: SpellAuraDefines.h:286
@ SPELL_AURA_PROC_TRIGGER_DAMAGE
Definition: SpellAuraDefines.h:106
@ SPELL_AURA_REFLECT_SPELLS_SCHOOL
Definition: SpellAuraDefines.h:137
@ SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:128
static bool isNonTriggerAura[TOTAL_AURAS]
Definition: Unit.cpp:106
static bool isTriggerAura[TOTAL_AURAS]
Definition: Unit.cpp:104
std::list< ProcTriggeredData > ProcTriggeredList
Definition: Unit.cpp:15941
@ REACTIVE_OVERPOWER
Definition: Unit.h:597
@ REACTIVE_DEFENSE
Definition: Unit.h:595
@ REACTIVE_HUNTER_PARRY
Definition: Unit.h:596
@ REACTIVE_WOLVERINE_BITE
Definition: Unit.h:598
@ CONDITION_SOURCE_TYPE_SPELL_PROC
Definition: ConditionMgr.h:148
@ EFFECT_2
Definition: SharedDefines.h:33
@ SPELL_ATTR3_INSTANT_TARGET_PROCS
Definition: SharedDefines.h:523
#define EFFECT_ALL
Definition: SharedDefines.h:38
@ SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES
Definition: SharedDefines.h:620
void UpdateCombatSkills(Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
Definition: PlayerUpdates.cpp:1025
Definition: Unit.cpp:15922
Definition: Unit.h:421
void SetProcCooldown(uint32 cooldown)
Definition: Unit.h:455
Unit * GetActionTarget() const
Definition: Unit.h:441
Unit * GetProcTarget() const
Definition: Unit.h:442
bool HandleProcTriggerSpell(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
Definition: Unit.cpp:9006
bool HandleAuraRaidProcFromChargeWithValue(AuraEffect *triggeredByAura)
Definition: Unit.cpp:17659
bool IsHunterPet() const
Definition: Unit.h:750
bool IsTriggeredAtSpellProcEvent(Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
Definition: Unit.cpp:17506
bool HandleAuraProc(Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
Definition: Unit.cpp:8811
virtual bool HasSpellItemCooldown(uint32, uint32) const
Definition: Unit.h:1265
bool HandleDummyAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
Definition: Unit.cpp:6685
void StartReactiveTimer(ReactiveType reactive)
Definition: Unit.h:1771
bool HandleOverrideClassScriptAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
Definition: Unit.cpp:9931
bool HandleAuraRaidProcFromCharge(AuraEffect *triggeredByAura)
Definition: Unit.cpp:17748
void HandleProcTriggerDamageAuraProc(AuraApplication *aurApp, ProcEventInfo &eventInfo)
Definition: SpellAuraEffects.cpp:7270
SpellModifier * GetSpellModifier() const
Definition: SpellAuraEffects.h:52
Unit * GetUnitOwner() const
Definition: SpellAuras.h:108

References AddComboPoints(), ASSERT, ProcTriggeredData::aura, AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, SpellInfo::CalcCastTime(), Aura::CallScriptAfterCheckProcHandlers(), Aura::CallScriptCheckProcHandlers(), CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_ROGUE, CLASS_WARRIOR, CONDITION_SOURCE_TYPE_SPELL_PROC, EFFECT_0, EFFECT_1, EFFECT_2, EFFECT_ALL, SpellInfo::Effects, ProcTriggeredData::effMask, FORM_GHOSTWOLF, ProcEventInfo::GetActionTarget(), ProcEventInfo::GetActor(), AuraEffect::GetAmount(), GetAppliedAuras(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), AuraEffect::GetCasterGUID(), Aura::GetEffect(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), ProcEventInfo::GetProcTarget(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), AuraEffect::GetSpellModifier(), Aura::GetUnitOwner(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandleProcTriggerDamageAuraProc(), HandleProcTriggerSpell(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpellItemCooldown(), SpellInfo::Id, IsCharmedOwnedByPlayerOrPlayer(), IsClass(), IsHunterPet(), isNonTriggerAura, Object::IsPlayer(), isTriggerAura, IsTriggeredAtSpellProcEvent(), LOG_DEBUG, Spell::m_appliedMods, Spell::m_weaponItem, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, MELEE_BASED_TRIGGER_MASK, ModifyAuraState(), PROC_EX_ABSORB, PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_INTERNAL_CANT_PROC, PROC_EX_INTERNAL_TRIGGERED, PROC_EX_MISS, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_EX_RESIST, PROC_FLAG_DONE_PERIODIC, PROC_HIT_CRITICAL, PROC_SPELL_PHASE_HIT, REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, REACTIVE_WOLVERINE_BITE, SpellInfo::SchoolMask, sConditionMgr, AuraEffect::SetAmount(), SetCantProc(), ProcEventInfo::SetProcCooldown(), SPELL_ATTR3_INSTANT_TARGET_PROCS, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES, SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELL_AURA_ADD_FLAT_MODIFIER, SPELL_AURA_ADD_PCT_MODIFIER, SPELL_AURA_DUMMY, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MECHANIC_IMMUNITY, SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_MECHANIC_RESISTANCE, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_MOD_POWER_COST_SCHOOL, SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_STUN, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_DAMAGE, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_AURA_RAID_PROC_FROM_CHARGE, SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_AURA_SPELL_MAGNET, SPELL_AURA_TRANSFORM, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, ProcTriggeredData::spellProcEvent, StartReactiveTimer(), Object::ToPlayer(), Object::ToUnit(), ProcTriggeredData::triggerSpelId, and Player::UpdateCombatSkills().

Referenced by CalcAbsorbResist(), and ProcDamageAndSpell().

◆ processDummyAuras()

float Unit::processDummyAuras ( float  TakenTotalMod) const
private
11995{
11996 // note: old code coming from TC, just extracted here to remove the code duplication + solve potential crash
11997 // see: https://github.com/TrinityCore/TrinityCore/commit/c85710e148d75450baedf6632b9ca6fd40b4148e
11998
11999 // .. taken pct: dummy auras
12000 auto const& mDummyAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
12001 for (auto i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i)
12002 {
12003 if (!(*i) || !(*i)->GetSpellInfo())
12004 {
12005 continue;
12006 }
12007
12008 if (auto spellIconId = (*i)->GetSpellInfo()->SpellIconID)
12009 {
12010 switch (spellIconId)
12011 {
12012 // Cheat Death
12013 case 2109:
12014 if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
12015 {
12016 // Patch 2.4.3: The resilience required to reach the 90% damage reduction cap
12017 // is 22.5% critical strike damage reduction, or 444 resilience.
12018 // To calculate for 90%, we multiply the 100% by 4 (22.5% * 4 = 90%)
12019 float mod = -1.0f * GetMeleeCritDamageReduction(400);
12020 AddPct(TakenTotalMod, std::max(mod, float((*i)->GetAmount())));
12021 }
12022 break;
12023 }
12024 }
12025 }
12026 return TakenTotalMod;
12027}

References AddPct(), GetAuraEffectsByType(), GetMeleeCritDamageReduction(), SPELL_AURA_DUMMY, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by MeleeDamageBonusTaken(), and SpellDamageBonusTaken().

◆ ProcessPositionDataChanged()

void Unit::ProcessPositionDataChanged ( PositionFullTerrainStatus const &  data)
overridevirtual

Reimplemented from WorldObject.

4320{
4323}
virtual void ProcessPositionDataChanged(PositionFullTerrainStatus const &data)
Definition: Object.cpp:1149
virtual void ProcessTerrainStatusUpdate()
Definition: Unit.cpp:4325

References WorldObject::ProcessPositionDataChanged(), and ProcessTerrainStatusUpdate().

Referenced by Creature::Create().

◆ ProcessTerrainStatusUpdate()

void Unit::ProcessTerrainStatusUpdate ( )
virtual

Reimplemented in Player.

4326{
4327 if (IsCreature())
4329
4330 if (IsFlying() || (!IsControlledByPlayer()))
4331 return;
4332
4333 LiquidData const& liquidData = GetLiquidData();
4334
4335 // remove appropriate auras if we are swimming/not swimming respectively
4336 if (liquidData.Status & MAP_LIQUID_STATUS_SWIMMING)
4338 else if (!isSwimming())
4340
4341 // liquid aura handling
4342 LiquidTypeEntry const* curLiquid = nullptr;
4343 if ((liquidData.Status & MAP_LIQUID_STATUS_SWIMMING))
4344 curLiquid = sLiquidTypeStore.LookupEntry(liquidData.Entry);
4345
4346 if (curLiquid != _lastLiquid)
4347 {
4350
4351 // Set _lastLiquid before casting liquid spell to avoid infinite loops
4352 _lastLiquid = curLiquid;
4353
4355 if (curLiquid && curLiquid->SpellId && (!player || !player->IsGameMaster()))
4356 CastSpell(this, curLiquid->SpellId, true);
4357 }
4358}
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
Definition: SpellDefines.h:50
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
Definition: SpellDefines.h:51
DBCStorage< LiquidTypeEntry > sLiquidTypeStore(LiquidTypefmt)
void UpdateMovementFlags()
Definition: Creature.cpp:3452
bool isSwimming() const
Definition: Unit.h:1628
bool IsFlying() const
Definition: Unit.h:1630
Definition: GridTerrainData.h:199
uint32 Entry
Definition: GridTerrainData.h:202
Definition: DBCStructure.h:1284
uint32 SpellId
Definition: DBCStructure.h:1290

References _lastLiquid, AURA_INTERRUPT_FLAG_NOT_ABOVEWATER, AURA_INTERRUPT_FLAG_NOT_UNDERWATER, CastSpell(), LiquidData::Entry, GetCharmerOrOwnerPlayerOrPlayerItself(), WorldObject::GetLiquidData(), IsControlledByPlayer(), Object::IsCreature(), IsFlying(), Player::IsGameMaster(), isSwimming(), MAP_LIQUID_STATUS_SWIMMING, RemoveAurasDueToSpell(), RemoveAurasWithInterruptFlags(), sLiquidTypeStore, LiquidTypeEntry::SpellId, LiquidData::Status, Object::ToCreature(), and Creature::UpdateMovementFlags().

Referenced by ProcessPositionDataChanged(), and Player::ProcessTerrainStatusUpdate().

◆ ProhibitSpellSchool()

virtual void Unit::ProhibitSpellSchool ( SpellSchoolMask  ,
uint32   
)
inlinevirtual

Reimplemented in Creature, and Player.

1505{ }

Referenced by Spell::EffectInterruptCast().

◆ propagateSpeedChange()

void Unit::propagateSpeedChange ( )
inline
void propagateSpeedChange()
Definition: MotionMaster.cpp:925

References GetMotionMaster(), and MotionMaster::propagateSpeedChange().

Referenced by SetSpeed(), and SetWalk().

◆ RecalculateObjectScale()

void Unit::RecalculateObjectScale ( )
virtual
16838{
16840 float scale = GetNativeObjectScale() + CalculatePct(1.0f, scaleAuras);
16841 float scaleMin = IsPlayer() ? 0.1f : 0.01f;
16842 SetObjectScale(std::max(scale, scaleMin));
16843}
@ SPELL_AURA_MOD_SCALE_2
Definition: SpellAuraDefines.h:302
@ SPELL_AURA_MOD_SCALE
Definition: SpellAuraDefines.h:124
virtual void SetObjectScale(float scale)
Definition: Object.h:120
virtual float GetNativeObjectScale() const
Definition: Unit.h:1888

References CalculatePct(), GetNativeObjectScale(), GetTotalAuraModifier(), Object::IsPlayer(), Object::SetObjectScale(), SPELL_AURA_MOD_SCALE, and SPELL_AURA_MOD_SCALE_2.

Referenced by AuraEffect::HandleAuraModScale().

◆ RemoveAllAttackers()

void Unit::RemoveAllAttackers ( )

Remove all units in m_attackers list and send them AttackStop()

10580{
10581 while (!m_attackers.empty())
10582 {
10583 AttackerSet::iterator iter = m_attackers.begin();
10584 if (!(*iter)->AttackStop())
10585 {
10586 LOG_ERROR("entities.unit", "WORLD: Unit has an attacker that isn't attacking it!");
10587 m_attackers.erase(iter);
10588 }
10589 }
10590}

References LOG_ERROR, and m_attackers.

Referenced by CombatStop(), Spell::EffectSanctuary(), boss_kaelthas::ExecuteMiddleEvent(), AuraEffect::HandleFeignDeath(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), and npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI().

◆ RemoveAllAuras()

void Unit::RemoveAllAuras ( )
5385{
5386 // this may be a dead loop if some events on aura remove will continiously apply aura on remove
5387 // we want to have all auras removed, so use your brain when linking events
5388 while (!m_appliedAuras.empty() || !m_ownedAuras.empty())
5389 {
5390 AuraApplicationMap::iterator aurAppIter;
5391 for (aurAppIter = m_appliedAuras.begin(); aurAppIter != m_appliedAuras.end();)
5393
5394 AuraMap::iterator aurIter;
5395 for (aurIter = m_ownedAuras.begin(); aurIter != m_ownedAuras.end();)
5396 RemoveOwnedAura(aurIter);
5397 }
5398}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by CleanupBeforeRemoveFromMap(), boss_muru::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_taldaram::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), boss_leotheras_the_blind::DoAction(), boss_kalecgos::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), boss_razorgore::boss_razorgoreAI::DoChangePhase(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), spell_herald_volzaj_insanity::HandleDummyEffect(), misc_commandscript::HandleUnAuraCommand(), boss_ick::boss_ickAI::JustDied(), boss_venoxis::JustDied(), boss_taldaram::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_commander_stoutbeard::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustReachedHome(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustReachedHome(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustReachedHome(), boss_urom::boss_uromAI::LeaveCombat(), boss_taldaram::MovementInform(), npc_hallows_end_soh::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), spell_kaelthas_flame_strike::OnRemove(), PretendToDie(), boss_alar::PretendToDie(), Creature::RemoveCorpse(), boss_venoxis::Reset(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_bjarngrim::boss_bjarngrimAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_hodir::boss_hodirAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_skadi_grauf::boss_skadi_graufAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), Pet::SavePetToDB(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), npc_harrison_jones::SpellHit(), npc_frost_sphere::npc_frost_sphereAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_magus_telestra::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), and npc_aeranas::npc_aeranasAI::UpdateAI().

◆ RemoveAllAurasExceptType()

void Unit::RemoveAllAurasExceptType ( AuraType  type)
5459{
5460 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5461 {
5462 Aura const* aura = iter->second->GetBase();
5463 if (aura->GetSpellInfo()->HasAura(type))
5464 ++iter;
5465 else
5467 }
5468
5469 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5470 {
5471 Aura* aura = iter->second;
5472 if (aura->GetSpellInfo()->HasAura(type))
5473 ++iter;
5474 else
5476 }
5477}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), SpellInfo::HasAura(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), and npc_iron_watcher::npc_iron_watcherAI::SpellHit().

◆ RemoveAllAurasOnDeath()

void Unit::RemoveAllAurasOnDeath ( )
5415{
5416 // used just after dieing to remove all visible auras
5417 // and disable the mods for the passive ones
5418 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5419 {
5420 Aura const* aura = iter->second->GetBase();
5423 else
5424 ++iter;
5425 }
5426
5427 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5428 {
5429 Aura* aura = iter->second;
5432 else
5433 ++iter;
5434 }
5435}
@ AURA_REMOVE_BY_DEATH
Definition: SpellAuraDefines.h:396
@ SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD
Definition: SharedDefines.h:654
bool IsDeathPersistent() const
Definition: SpellAuras.cpp:1087

References _UnapplyAura(), AURA_REMOVE_BY_DEATH, Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsDeathPersistent(), Aura::IsPassive(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), and SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD.

Referenced by spell_dk_death_pact::FilterTargets(), Kill(), Player::LoadFromDB(), and setDeathState().

◆ RemoveAllAurasRequiringDeadTarget()

void Unit::RemoveAllAurasRequiringDeadTarget ( )
5438{
5439 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5440 {
5441 Aura const* aura = iter->second->GetBase();
5442 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5444 else
5445 ++iter;
5446 }
5447
5448 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5449 {
5450 Aura* aura = iter->second;
5451 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5453 else
5454 ++iter;
5455 }
5456}
bool IsRequiringDeadTarget() const
Definition: SpellInfo.cpp:1222

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), Aura::IsPassive(), SpellInfo::IsRequiringDeadTarget(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by Player::LoadFromDB().

◆ RemoveAllControlled()

void Unit::RemoveAllControlled ( bool  onDeath = false)
11182{
11183 // possessed pet and vehicle
11184 if (IsPlayer())
11186
11187 while (!m_Controlled.empty())
11188 {
11189 Unit* target = *m_Controlled.begin();
11190 m_Controlled.erase(m_Controlled.begin());
11191 if (target->GetCharmerGUID() == GetGUID())
11192 {
11193 target->RemoveCharmAuras();
11194 }
11195 else if (target->GetOwnerGUID() == GetGUID() && target->IsSummon())
11196 {
11197 if (!(onDeath && !IsPlayer() && target->IsGuardian()))
11198 {
11199 target->ToTempSummon()->UnSummon();
11200 }
11201 }
11202 else
11203 {
11204 LOG_ERROR("entities.unit", "Unit {} is trying to release unit {} which is neither charmed nor owned by it", GetEntry(), target->GetEntry());
11205 }
11206 }
11207}
void StopCastingCharm(Aura *except=nullptr)
Definition: Player.cpp:9381
bool IsGuardian() const
Definition: Unit.h:747
void RemoveCharmAuras()
Definition: Unit.cpp:11289

References GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), IsGuardian(), Object::IsPlayer(), IsSummon(), LOG_ERROR, m_Controlled, RemoveCharmAuras(), Player::StopCastingCharm(), Object::ToPlayer(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ RemoveAllDynObjects()

void Unit::RemoveAllDynObjects ( )
6260{
6261 while (!m_dynObj.empty())
6262 m_dynObj.front()->Remove();
6263}

References m_dynObj.

Referenced by RemoveFromWorld(), Player::TeleportTo(), and npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI().

◆ RemoveAllGameObjects()

void Unit::RemoveAllGameObjects ( )
6360{
6361 while(!m_gameObj.empty())
6362 {
6363 GameObject* go = ObjectAccessor::GetGameObject(*this, *m_gameObj.begin());
6364 if (go)
6365 {
6367 go->SetRespawnTime(0);
6368 go->Delete();
6369 }
6370 m_gameObj.erase(m_gameObj.begin());
6371 }
6372}
void Delete()
Definition: GameObject.cpp:978
void SetRespawnTime(int32 respawn)
Definition: GameObject.cpp:1284

References GameObject::Delete(), ObjectGuid::Empty, ObjectAccessor::GetGameObject(), m_gameObj, GameObject::SetOwnerGUID(), and GameObject::SetRespawnTime().

Referenced by CleanupBeforeRemoveFromMap(), npc_ice_tomb::npc_ice_tombAI::JustDied(), RemoveFromWorld(), npc_brewfest_super_brew_trigger::UpdateAI(), and boss_sapphiron::boss_sapphironAI::UpdateAI().

◆ RemoveAllMinionsByEntry()

void Unit::RemoveAllMinionsByEntry ( uint32  entry)
10959{
10960 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10961 {
10962 Unit* unit = *itr;
10963 ++itr;
10964 if (unit->GetEntry() == entry && unit->IsCreature()
10965 && unit->ToCreature()->IsSummon()) // minion, actually
10966 unit->ToTempSummon()->UnSummon();
10967 // i think this is safe because i have never heard that a despawned minion will trigger a same minion
10968 }
10969}

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, Object::ToCreature(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Spell::EffectSummonType(), npc_nelson::npc_nelsonAI::Reset(), SetMinion(), and npc_nelson::npc_nelsonAI::UpdateAI().

◆ RemoveAppliedAuras() [1/2]

void Unit::RemoveAppliedAuras ( std::function< bool(AuraApplication const *)> const &  check)
4936{
4937 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
4938 {
4939 if (check(iter->second))
4940 {
4941 RemoveAura(iter);
4942 continue;
4943 }
4944 ++iter;
4945 }
4946}

References m_appliedAuras, and RemoveAura().

Referenced by RemoveArenaAuras().

◆ RemoveAppliedAuras() [2/2]

void Unit::RemoveAppliedAuras ( uint32  spellId,
std::function< bool(AuraApplication const *)> const &  check 
)
4962{
4963 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4964 {
4965 if (check(iter->second))
4966 {
4967 RemoveAura(iter);
4968 continue;
4969 }
4970 ++iter;
4971 }
4972}

References m_appliedAuras, and RemoveAura().

◆ RemoveAreaAurasDueToLeaveWorld()

void Unit::RemoveAreaAurasDueToLeaveWorld ( )
5352{
5353 // make sure that all area auras not applied on self are removed - prevent access to deleted pointer later
5354 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5355 {
5356 Aura* aura = iter->second;
5357 ++iter;
5358 Aura::ApplicationMap const& appMap = aura->GetApplicationMap();
5359 for (Aura::ApplicationMap::const_iterator itr = appMap.begin(); itr != appMap.end();)
5360 {
5361 AuraApplication* aurApp = itr->second;
5362 ++itr;
5363 Unit* target = aurApp->GetTarget();
5364 if (target == this)
5365 continue;
5366 target->RemoveAura(aurApp);
5367 // things linked on aura remove may apply new area aura - so start from the beginning
5368 iter = m_ownedAuras.begin();
5369 }
5370 }
5371
5372 // remove area auras owned by others
5373 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5374 {
5375 if (iter->second->GetBase()->GetOwner() != this)
5376 {
5377 RemoveAura(iter);
5378 }
5379 else
5380 ++iter;
5381 }
5382}
ApplicationMap const & GetApplicationMap()
Definition: SpellAuras.h:181
std::map< ObjectGuid, AuraApplication * > ApplicationMap
Definition: SpellAuras.h:90

References Aura::GetApplicationMap(), AuraApplication::GetTarget(), m_appliedAuras, m_ownedAuras, and RemoveAura().

Referenced by RemoveFromWorld().

◆ RemoveArenaAuras()

void Unit::RemoveArenaAuras ( )
5401{
5402 // in join, remove positive buffs, on end, remove negative
5403 // used to remove positive visible auras in arenas
5404 RemoveAppliedAuras([](AuraApplication const* aurApp)
5405 {
5406 Aura const* aura = aurApp->GetBase();
5407 return (!aura->GetSpellInfo()->HasAttribute(SPELL_ATTR4_ALLOW_ENETRING_ARENA) // don't remove stances, shadowform, pally/hunter auras
5408 && !aura->IsPassive() // don't remove passive auras
5409 && (aurApp->IsPositive() || !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD))) || // not negative death persistent auras
5410 aura->GetSpellInfo()->HasAttribute(SPELL_ATTR5_REMOVE_ENTERING_ARENA); // special marker, always remove
5411 });
5412}
@ SPELL_ATTR5_REMOVE_ENTERING_ARENA
Definition: SharedDefines.h:580
@ SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD
Definition: SharedDefines.h:524
@ SPELL_ATTR4_ALLOW_ENETRING_ARENA
Definition: SharedDefines.h:562
void RemoveAppliedAuras(std::function< bool(AuraApplication const *)> const &check)
Definition: Unit.cpp:4935
bool IsPositive() const
Definition: SpellAuras.h:68

References AuraApplication::GetBase(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsPassive(), AuraApplication::IsPositive(), RemoveAppliedAuras(), SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD, SPELL_ATTR4_ALLOW_ENETRING_ARENA, and SPELL_ATTR5_REMOVE_ENTERING_ARENA.

Referenced by Player::TeleportTo().

◆ RemoveAura() [1/4]

void Unit::RemoveAura ( Aura aur,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4915{
4916 if (aura->IsRemoved())
4917 return;
4918 if (AuraApplication* aurApp = aura->GetApplicationOfTarget(GetGUID()))
4919 RemoveAura(aurApp, mode);
4920}

References Aura::GetApplicationOfTarget(), Object::GetGUID(), Aura::IsRemoved(), and RemoveAura().

◆ RemoveAura() [2/4]

void Unit::RemoveAura ( AuraApplication aurApp,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4872{
4873 // we've special situation here, RemoveAura called while during aura removal
4874 // this kind of call is needed only when aura effect removal handler
4875 // or event triggered by it expects to remove
4876 // not yet removed effects of an aura
4877 if (aurApp->GetRemoveMode())
4878 {
4879 // remove remaining effects of an aura
4880 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4881 {
4882 if (aurApp->HasEffect(itr))
4883 aurApp->_HandleEffect(itr, false);
4884 }
4885 return;
4886 }
4887 // no need to remove
4888 if (aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) != aurApp || aurApp->GetBase()->IsRemoved())
4889 return;
4890
4891 uint32 spellId = aurApp->GetBase()->GetId();
4892 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4893
4894 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4895 {
4896 if (aurApp == iter->second)
4897 {
4898 // Prevent Arena Preparation aura from being removed by player actions
4899 // It's an invisibility spell so any interaction/spell cast etc. removes it.
4900 // Should only be removed by the arena script, once the match starts.
4902 {
4903 return;
4904 }
4905
4906 RemoveAura(iter, mode);
4907 return;
4908 }
4909 else
4910 ++iter;
4911 }
4912}
@ SPELL_AURA_ARENA_PREPARATION
Definition: SpellAuraDefines.h:278

References AuraApplication::_HandleEffect(), Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), AuraApplication::GetRemoveMode(), AuraApplication::HasEffect(), Aura::HasEffectType(), Aura::IsRemoved(), m_appliedAuras, MAX_SPELL_EFFECTS, RemoveAura(), and SPELL_AURA_ARENA_PREPARATION.

◆ RemoveAura() [3/4]

void Unit::RemoveAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4842{
4843 AuraApplication* aurApp = i->second;
4844 // Do not remove aura which is already being removed
4845 if (aurApp->GetRemoveMode())
4846 return;
4847 Aura* aura = aurApp->GetBase();
4848 _UnapplyAura(i, mode);
4849 // Remove aura - for Area and Target auras
4850 if (aura->GetOwner() == this)
4851 aura->Remove(mode);
4852}

References _UnapplyAura(), AuraApplication::GetBase(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), and Aura::Remove().

Referenced by _RemoveNoStackAurasDueToAura(), boss_marli::_schedulePhaseTroll(), ApplySpellDispelImmunity(), Player::CheckAreaExploreAndOutdoor(), boss_headless_horseman::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_hor_lich_king::npc_hor_lich_kingAI::DoAction(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), npc_harrison_jones::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_paletress::boss_paletressAI::DoAction(), boss_vezax::boss_vezaxAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DoAction(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::DoAction(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), Player::DuelComplete(), Spell::EffectDispelMechanic(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectSummonPet(), Spell::EffectTriggerSpell(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), Spell::finish(), GetDiseasesByCaster(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_valanar_kinetic_bomb_aura::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_midsummer_ribbon_pole::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), spell_dk_presence::HandleEffectRemove(), spell_pal_blessing_of_sanctuary::HandleEffectRemove(), spell_sha_chain_heal::HandleHeal(), spell_sindragosa_frost_breath::HandleInfusion(), spell_warl_demonic_circle_summon::HandleRemove(), spell_putricide_eat_ooze::HandleScript(), spell_handover_reins::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_jaraxxus::boss_jaraxxusAI::JustEngagedWith(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::JustEngagedWith(), npc_ulduar_snow_mound::MoveInLineOfSight(), spell_blood_queen_vampiric_bite::OnCast(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), npc_essence_of_twin::OnGossipHello(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), npc_thrall_bfu::OnQuestReward(), npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), BattlefieldWG::PromotePlayer(), RemoveAppliedAuras(), RemoveAreaAurasDueToLeaveWorld(), RemoveAura(), RemoveAurasByShapeShift(), RemoveAurasByType(), RemoveAurasDueToItemSpell(), RemoveAurasDueToSpell(), RemoveAurasWithAttribute(), RemoveAurasWithFamily(), RemoveAurasWithInterruptFlags(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), BattlegroundIC::RemovePlayer(), BattlegroundMap::RemovePlayerFromMap(), boss_bjarngrim::boss_bjarngrimAI::RemoveStanceAura(), boss_gyth::boss_gythAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_marli::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), NPCStaveQuestAI::ResetState(), boss_anomalus::SetData(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_malygos::boss_malygosAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), boss_headless_horseman::SpellHit(), boss_viscidus::SpellHit(), spell_pal_hand_of_sacrifice_aura::Split(), boss_sartharion_shadron::boss_sartharion_shadronAI::SummonedCreatureDies(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_viscidus::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), Spell::UpdateChanneledTargetList(), and boss_bjarngrim::boss_bjarngrimAI::WaypointReached().

◆ RemoveAura() [4/4]

void Unit::RemoveAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4855{
4856 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4857 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4858 {
4859 Aura const* aura = iter->second->GetBase();
4860 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4861 && (!caster || aura->GetCasterGUID() == caster))
4862 {
4863 RemoveAura(iter, removeMode);
4864 return;
4865 }
4866 else
4867 ++iter;
4868 }
4869}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

◆ RemoveAuraFromStack()

void Unit::RemoveAuraFromStack ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4991{
4992 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4993 for (AuraMap::iterator iter = range.first; iter != range.second;)
4994 {
4995 Aura* aura = iter->second;
4996 if ((aura->GetType() == UNIT_AURA_TYPE)
4997 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
4998 {
4999 aura->ModStackAmount(-1, removeMode);
5000 return;
5001 }
5002 else
5003 ++iter;
5004 }
5005}
@ UNIT_AURA_TYPE
Definition: SpellAuraDefines.h:385
bool ModStackAmount(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT, bool periodicReset=false)
Definition: SpellAuras.cpp:1021
AuraObjectType GetType() const
Definition: SpellAuras.cpp:481

References Aura::GetCasterGUID(), Aura::GetType(), m_ownedAuras, Aura::ModStackAmount(), and UNIT_AURA_TYPE.

Referenced by Spell::EffectSchoolDMG(), HandleAuraProc(), HandleDummyAuraProc(), spell_putricide_gaseous_bloat_aura::HandleExtraEffect(), spell_oculus_evasive_maneuvers_aura::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_item_brittle_armor::HandleScript(), spell_item_mercurial_shield::HandleScript(), boss_selin_fireheart::JustEngagedWith(), and boss_viscidus::SpellHit().

◆ RemoveAurasByShapeShift()

void Unit::RemoveAurasByShapeShift ( )
5336{
5337 uint32 mechanic_mask = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT);
5338 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5339 {
5340 Aura const* aura = iter->second->GetBase();
5341 if ((aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask) &&
5343 {
5344 RemoveAura(iter);
5345 continue;
5346 }
5347 ++iter;
5348 }
5349}
@ SPELL_ATTR0_CU_AURA_CC
Definition: SpellInfo.h:181
uint32 GetAllEffectsMechanicMask() const
Definition: SpellInfo.cpp:2003

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), m_appliedAuras, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), SPELL_ATTR0_CU_AURA_CC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by AuraEffect::HandleAuraModShapeshift().

◆ RemoveAurasByType()

void Unit::RemoveAurasByType ( AuraType  auraType,
ObjectGuid  casterGUID = ObjectGuid::Empty,
Aura except = nullptr,
bool  negative = true,
bool  positive = true 
)
5176{
5177 // simple check if list is empty
5178 if (m_modAuras[auraType].empty())
5179 return;
5180
5181 for (AuraEffectList::iterator iter = m_modAuras[auraType].begin(); iter != m_modAuras[auraType].end();)
5182 {
5183 Aura* aura = (*iter)->GetBase();
5185
5186 ++iter;
5187 if (aura != except && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5188 && ((negative && !aurApp->IsPositive()) || (positive && aurApp->IsPositive())))
5189 {
5190 uint32 removedAuras = m_removedAurasCount;
5191 RemoveAura(aurApp);
5192 if (m_removedAurasCount > removedAuras)
5193 iter = m_modAuras[auraType].begin();
5194 }
5195 }
5196}

References Aura::GetApplicationOfTarget(), Aura::GetCasterGUID(), Object::GetGUID(), AuraApplication::IsPositive(), m_modAuras, m_removedAurasCount, and RemoveAura().

Referenced by _EnterVehicle(), Spell::_handle_finish_phase(), Player::ActivateTaxiPathTo(), Battleground::AddPlayer(), Attack(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), spell_gen_summon_tournament_mount::CheckIfLanceEquipped(), ClearComboPoints(), Player::ContinueTaxiFlight(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), Spell::DoSpellHitOnUnit(), Spell::EffectPowerBurn(), Spell::EffectTriggerSpell(), BattlegroundWS::EventPlayerClickedOnFlag(), ExitVehicle(), WorldSession::HandleAuctionHelloOpcode(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraModStateImmunity(), AuraEffect::HandleAuraMounted(), AuraEffect::HandleAuraTransform(), WorldSession::HandleBankerActivateOpcode(), WorldSession::HandleBinderActivateOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleBuyStableSlot(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_item_reindeer_transformation::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), HandleDummyAuraProc(), spell_rog_vanish::HandleEffect(), spell_hydross_mark_of_hydross::HandleEffectApply(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandleListStabledPetsOpcode(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), WorldSession::HandleMoveWorldportAck(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_algalon_remove_phase_aura::HandlePeriodic(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSaveGuildEmblemOpcode(), spell_gen_mine_sweeper::HandleSchoolDMG(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSpiritHealerActivateOpcode(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleTabardVendorActivateOpcode(), WorldSession::HandleTalentWipeConfirmOpcode(), WorldSession::HandleTaxiQueryAvailableNodes(), WorldSession::HandleTrainerBuySpellOpcode(), WorldSession::HandleUnstablePet(), boss_gurtogg_bloodboil::JustEngagedWith(), Player::LeaveBattleground(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), spell_gen_aura_service_uniform::OnApply(), Player::ProcessDelayedOperations(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Vehicle::RemoveAllPassengers(), RemoveBindSightAuras(), RemoveCharmAuras(), Battleground::RemovePlayerAtLeave(), WorldSession::SendDoFlight(), WorldSession::SendListInventory(), Player::SendLoot(), WorldSession::SendTrainerList(), SetCharmedBy(), Player::StopCastingCharm(), Player::TeleportTo(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), GameObject::Use(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ RemoveAurasDueToItemSpell()

void Unit::RemoveAurasDueToItemSpell ( uint32  spellId,
ObjectGuid  castItemGuid 
)
5151{
5152 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
5153 {
5154 if (iter->second->GetBase()->GetCastItemGUID() == castItemGuid)
5155 {
5156 RemoveAura(iter);
5157 iter = m_appliedAuras.lower_bound(spellId);
5158 }
5159 else
5160 ++iter;
5161 }
5162
5163 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
5164 {
5165 if (iter->second->GetCastItemGUID() == castItemGuid)
5166 {
5168 iter = m_ownedAuras.lower_bound(spellId);
5169 }
5170 else
5171 ++iter;
5172 }
5173}

References AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, RemoveAura(), and RemoveOwnedAura().

Referenced by Player::ApplyEnchantment(), and Player::ApplyEquipSpell().

◆ RemoveAurasDueToSpell()

void Unit::RemoveAurasDueToSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4975{
4976 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4977 {
4978 Aura const* aura = iter->second->GetBase();
4979 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4980 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
4981 {
4982 RemoveAura(iter, removeMode);
4983 iter = m_appliedAuras.lower_bound(spellId);
4984 }
4985 else
4986 ++iter;
4987 }
4988}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

Referenced by Spell::_cast(), Player::_removeTalentAurasAndSpells(), Player::ActivateSpec(), Vehicle::AddPassenger(), spell_commander_sarannis_arcane_devastation::AfterApply(), spell_dru_feral_swiftness::AfterRemove(), spell_dru_barkskin::AfterRemove(), spell_dru_savage_roar_aura::AfterRemove(), spell_dru_survival_instincts_aura::AfterRemove(), Player::ApplyEquipSpell(), anonymous_namespace{GmVisibleCommandTest.cpp}::GmVisibleCommandTest::ApplyGmVisibleState(), boss_hakkar::boss_hakkarAI::ApplyHakkarPowerStacks(), Player::ApplyItemObtainSpells(), boss_buru::ChaseNewVictim(), spell_eredar_twins_handle_touch::CheckCast(), boss_volazj::CheckPhaseMinions(), spell_botanica_shift_form_aura::CheckProc(), spell_mage_burning_determination::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), Player::CleanupAfterTaxiFlight(), AuraEffect::CleanupTriggeredSpells(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), spell_ruby_sanctum_rallying_shout::CountAllies(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_buru::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_leotheras_the_blind::DemonTime(), WorldState::DispelAdalsSongOfBattle(), WorldState::DispelMagtheridonTeam(), npc_drakonid_spawner::DoAction(), npc_twilight_volunteer::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_frozen_core::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), npc_pet_gen_argent_pony_bridle::DoAction(), boss_alar::DoDiveBomb(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), Spell::DoTriggersOnSpellHit(), Spell::EffectApplyGlyph(), Spell::EffectHeal(), Spell::EffectRemoveAura(), Spell::EffectSchoolDMG(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_zuljin::EnterPhase(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), BattleExperienceEvent::Execute(), SendEncounterUnit::Execute(), FrostBombExplosion::Execute(), AuraRemoveEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), spell_sindragosa_ice_tomb_trap_aura::ExtraRemoveEffect(), spell_mother_shahraz_fatal_attraction_dummy::FilterTargets(), spell_warr_improved_spell_reflection_trigger::FilterTargets(), lfg::LFGMgr::FinishDungeon(), spell_dru_berserk::HandleAfterCast(), spell_capacitus_polarity_charge_aura::HandleAfterRemove(), spell_amanitar_remove_mushroom_power::HandleApply(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_moroes_vanish::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_warhead_detonate::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), HandleDummyAuraProc(), spell_magtheridon_shadow_grasp_visual::HandleDummyRemove(), spell_shadowfang_keep_forsaken_skills_aura::HandleDummyTick(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_q12730_quenching_mist::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectRemove(), spell_serpentshrine_cavern_coilfang_water::HandleEffectRemove(), spell_q10769_dissension_amongst_the_ranks_aura::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), spell_midsummer_fling_torch::HandleFinish(), gm_commandscript::HandleGMVisibleCommand(), group_commandscript::HandleGroupReviveCommand(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), spell_transitus_shield_beam_aura::HandleOnEffectRemove(), OPvPCapturePointZM_Graveyard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_algalon_remove_phase_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldState::HandlePlayerLeaveZone(), OutdoorPvPEP::HandlePlayerLeaveZone(), OutdoorPvPHP::HandlePlayerLeaveZone(), OutdoorPvPNA::HandlePlayerLeaveZone(), OutdoorPvPSI::HandlePlayerLeaveZone(), OutdoorPvPTF::HandlePlayerLeaveZone(), OutdoorPvPZM::HandlePlayerLeaveZone(), spell_gen_consume::HandleProc(), spell_pri_t4_4p_bonus::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), spell_icc_harvest_blight_specimen::HandleQuestComplete(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleRemove(), spell_dru_enrage::HandleRemove(), spell_pal_divine_intervention::HandleRemove(), spell_pal_avenging_wrath::HandleRemove(), spell_rog_killing_spree_aura::HandleRemove(), spell_warr_vigilance::HandleRemove(), WorldSession::HandleRemoveGlyph(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_putricide_clear_aura_effect_value::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_jump_remove_aura::HandleScript(), spell_icc_harvest_blight_specimen::HandleScript(), spell_festergut_pungent_blight::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_q10651_q10692_book_of_fel_names::HandleScript(), spell_q12641_death_comes_from_on_high_recall_eye::HandleScriptEffect(), spell_halion_clear_debuffs::HandleScriptEffect(), spell_q12823_remove_collapsing_cave_aura::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), spell_capacitus_polarity_charge::HandleTargets(), misc_commandscript::HandleUnAuraCommand(), misc_commandscript::HandleUnFreezeCommand(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), npc_underbog_mushroom::InitializeAI(), npc_demon_chain::JustDied(), boss_azuregos::boss_azuregosAI::JustDied(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::JustDied(), boss_zuljin::JustEngagedWith(), boss_bronjahm::boss_bronjahmAI::JustEngagedWith(), boss_doomwalker::JustEngagedWith(), boss_gruul::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_buru::JustEngagedWith(), boss_gal_darah::boss_gal_darahAI::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_hydross_the_unstable::JustReachedHome(), boss_felblood_kaelthas::LapseAction(), boss_garfrost::boss_garfrostAI::MovementInform(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::MovementInform(), boss_felmyst::MovementInform(), boss_shade_of_akama::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), spell_halion_twilight_realm_aura::OnApply(), spell_halion_leave_twilight_realm_aura::OnApply(), spell_systems_shutdown_aura::OnApply(), npc_chesspiece::OnCharmed(), npc_aged_dying_ancient_kodo::OnGossipHello(), spell_claw_rage_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_gen_curse_of_pain::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), BattlefieldWG::OnPlayerLeaveZone(), lfg::LFGPlayerScript::OnPlayerMapChanged(), MidsummerPlayerScript::OnPlayerUpdateZone(), boss_shade_of_aran::OnPowerUpdate(), spell_halion_combustion_consumption_aura::OnRemove(), spell_halion_leave_twilight_realm_aura::OnRemove(), spell_algalon_phase_punch_aura::OnRemove(), spell_load_into_catapult_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), spell_hun_ascpect_of_the_viper::OnRemove(), spell_hun_viper_attack_speed::OnRemove(), spell_item_with_mount_speed::OnRemove(), spell_item_desperate_defense::OnRemove(), spell_item_shadowmourne::OnRemove(), spell_item_shadowmourne_soul_fragment::OnRemove(), spell_mage_combustion_proc::OnRemove(), spell_item_shadowmourne_soul_fragment::OnStackChange(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::PassengerBoarded(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::PassengerBoarded(), boss_jeklik::PathEndReached(), ProcessTerrainStatusUpdate(), spell_gen_defend::RefreshVisualShields(), RemoveAurasDueToSpellByDispel(), BattlefieldWG::RemoveAurasFromPlayer(), boss_festergut::boss_festergutAI::RemoveBlight(), spell_warl_health_funnel::RemoveEffect(), RemoveGameObject(), BattlegroundAV::RemovePlayer(), Battleground::RemovePlayerFromResurrectQueue(), boss_keristrasza::RemovePrison(), Pet::removeSpell(), Player::removeSpell(), spell_gen_eject_all_passengers::RemoveVehicleAuras(), spell_gen_defend::RemoveVisualShields(), boss_malchezaar::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), boss_kiljaeden::Reset(), boss_twilight_corrupter::Reset(), boss_nalorakk::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_thekal::Reset(), boss_cthun::Reset(), boss_viscidus::Reset(), boss_halion::boss_halionAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_leotheras_the_blind::Reset(), boss_lethon::boss_lethonAI::Reset(), boss_taerar::boss_taerarAI::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), Player::ResurrectPlayer(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_magtheridon::ScheduleCombatEvents(), boss_supremus::SchedulePhase(), boss_laj::ScheduleTasks(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), OPvPCapturePointZM_Graveyard::SetBeaconState(), boss_hydross_the_unstable::SetForm(), Player::SetGMVisible(), boss_mandokir::boss_mandokirAI::SetGUID(), Player::SetIsSpectator(), SetModelVisible(), npc_akama_shade::sGossipSelect(), boss_viscidus::SoftReset(), boss_ossirian::SpellHit(), npc_omen::npc_omenAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), advisor_baseAI::SpellHit(), boss_moorabi::boss_moorabiAI::SpellHitTarget(), boss_festergut::boss_festergutAI::SpellHitTarget(), boss_ahune::Submerge(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_cthun::SummonedCreatureDies(), npc_kiljaeden_controller::SummonedCreatureDies(), boss_anzu::SummonedCreatureDies(), boss_viscidus::SummonedCreatureDies(), boss_terestian_illhoof::SummonKilrek(), Player::SummonPet(), boss_netherspite::SwitchToBanishPhase(), boss_netherspite::SwitchToPortalPhase(), Totem::UnSummon(), spell_black_temple_spell_absorption_aura::Update(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_moam::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_anzu::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_darting_hatchling::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ RemoveAurasDueToSpellByDispel()

void Unit::RemoveAurasDueToSpellByDispel ( uint32  spellId,
uint32  dispellerSpellId,
ObjectGuid  casterGUID,
Unit dispeller,
uint8  chargesRemoved = 1 
)
5008{
5009 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5010 for (AuraMap::iterator iter = range.first; iter != range.second;)
5011 {
5012 Aura* aura = iter->second;
5013 if (aura->GetCasterGUID() == casterGUID)
5014 {
5015 DispelInfo dispelInfo(dispeller, dispellerSpellId, chargesRemoved);
5016
5017 // Call OnDispel hook on AuraScript
5018 aura->CallScriptDispel(&dispelInfo);
5019
5021 aura->ModCharges(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
5022 else
5023 aura->ModStackAmount(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
5024
5025 // Call AfterDispel hook on AuraScript
5026 aura->CallScriptAfterDispel(&dispelInfo);
5027
5028 switch (aura->GetSpellInfo()->SpellFamilyName)
5029 {
5030 case SPELLFAMILY_HUNTER:
5031 {
5032 // Noxious Stings
5033 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x1000)
5034 {
5035 if (Unit* caster = aura->GetCaster())
5036 {
5037 if (AuraEffect* aureff = caster->GetAuraEffect(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_HUNTER, 3521, 1))
5038 {
5039 if (Aura* noxious = Aura::TryCreate(aura->GetSpellInfo(), aura->GetEffectMask(), dispeller, caster))
5040 {
5041 noxious->SetDuration(aura->GetDuration() * aureff->GetAmount() / 100);
5042 if (aura->GetUnitOwner())
5043 if (const std::vector<int32>* spell_triggered = sSpellMgr->GetSpellLinked(-int32(aura->GetId())))
5044 for (std::vector<int32>::const_iterator itr = spell_triggered->begin(); itr != spell_triggered->end(); ++itr)
5045 aura->GetUnitOwner()->RemoveAurasDueToSpell(*itr);
5046 }
5047 }
5048 }
5049 }
5050 break;
5051 }
5053 {
5054 // Icy Clutch, remove with Frost Fever
5055 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x4000000)
5056 {
5057 if (AuraEffect* aureff = GetAuraEffect(SPELL_AURA_MOD_DECREASE_SPEED, SPELLFAMILY_DEATHKNIGHT, 0, 0x40000, 0, casterGUID))
5058 RemoveAurasDueToSpell(aureff->GetId());
5059 }
5060 }
5061 default:
5062 break;
5063 }
5064 return;
5065 }
5066 else
5067 ++iter;
5068 }
5069}
Definition: Unit.h:297
void CallScriptDispel(DispelInfo *dispelInfo)
Definition: SpellAuras.cpp:2390
static Aura * TryCreate(SpellInfo const *spellproto, uint8 effMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemGUID=ObjectGuid::Empty)
Definition: SpellAuras.cpp:352
bool ModCharges(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: SpellAuras.cpp:973
void CallScriptAfterDispel(DispelInfo *dispelInfo)
Definition: SpellAuras.cpp:2403

References AURA_REMOVE_BY_ENEMY_SPELL, Aura::CallScriptAfterDispel(), Aura::CallScriptDispel(), GetAuraEffect(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetDuration(), Aura::GetEffectMask(), Aura::GetId(), DispelInfo::GetRemovedCharges(), Aura::GetSpellInfo(), Aura::GetUnitOwner(), SpellInfo::HasAttribute(), m_ownedAuras, Aura::ModCharges(), Aura::ModStackAmount(), RemoveAurasDueToSpell(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, sSpellMgr, and Aura::TryCreate().

Referenced by Spell::EffectDispel().

◆ RemoveAurasDueToSpellBySteal()

void Unit::RemoveAurasDueToSpellBySteal ( uint32  spellId,
ObjectGuid  casterGUID,
Unit stealer 
)
5072{
5073 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5074 for (AuraMap::iterator iter = range.first; iter != range.second;)
5075 {
5076 Aura* aura = iter->second;
5077 if (aura->GetCasterGUID() == casterGUID)
5078 {
5079 int32 damage[MAX_SPELL_EFFECTS];
5080 int32 baseDamage[MAX_SPELL_EFFECTS];
5081 uint8 effMask = 0;
5082 uint8 recalculateMask = 0;
5083 Unit* caster = aura->GetCaster();
5084 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5085 {
5086 if (aura->GetEffect(i))
5087 {
5088 baseDamage[i] = aura->GetEffect(i)->GetBaseAmount();
5089 damage[i] = aura->GetEffect(i)->GetAmount();
5090 effMask |= (1 << i);
5091 if (aura->GetEffect(i)->CanBeRecalculated())
5092 recalculateMask |= (1 << i);
5093 }
5094 else
5095 {
5096 baseDamage[i] = 0;
5097 damage[i] = 0;
5098 }
5099 }
5100
5102 // Cast duration to unsigned to prevent permanent aura's such as Righteous Fury being permanently added to caster
5103 uint32 dur = std::min(2u * MINUTE * IN_MILLISECONDS, uint32(aura->GetDuration()));
5104
5105 if (Aura* oldAura = stealer->GetAura(aura->GetId(), aura->GetCasterGUID()))
5106 {
5107 if (stealCharge)
5108 oldAura->ModCharges(1);
5109 else
5110 oldAura->ModStackAmount(1);
5111 oldAura->SetDuration(int32(dur));
5112 }
5113 else
5114 {
5115 // single target state must be removed before aura creation to preserve existing single target aura
5116 if (aura->IsSingleTarget())
5117 aura->UnregisterSingleTarget();
5118
5119 // Xinef: if stealer has same aura
5120 Aura* curAura = stealer->GetAura(aura->GetId());
5121 if (!curAura || (!curAura->IsPermanent() && curAura->GetDuration() < (int32)dur))
5122 if (Aura* newAura = Aura::TryRefreshStackOrCreate(aura->GetSpellInfo(), effMask, stealer, nullptr, &baseDamage[0], nullptr, aura->GetCasterGUID()))
5123 {
5124 // created aura must not be single target aura,, so stealer won't loose it on recast
5125 if (newAura->IsSingleTarget())
5126 {
5127 newAura->UnregisterSingleTarget();
5128 // bring back single target aura status to the old aura
5129 aura->SetIsSingleTarget(true);
5130 caster->GetSingleCastAuras().push_back(aura);
5131 }
5132 // FIXME: using aura->GetMaxDuration() maybe not blizzlike but it fixes stealing of spells like Innervate
5133 newAura->SetLoadedState(aura->GetMaxDuration(), int32(dur), stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]);
5134 newAura->ApplyForTargets();
5135 }
5136 }
5137
5138 if (stealCharge)
5140 else
5142
5143 return;
5144 }
5145 else
5146 ++iter;
5147 }
5148}
bool CanBeRecalculated() const
Definition: SpellAuraEffects.h:78
int32 GetBaseAmount() const
Definition: SpellAuraEffects.h:57
void UnregisterSingleTarget()
Definition: SpellAuras.cpp:1167
bool IsPermanent() const
Definition: SpellAuras.h:139

References AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::CanBeRecalculated(), AuraEffect::GetAmount(), GetAura(), AuraEffect::GetBaseAmount(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetCharges(), Aura::GetDuration(), Aura::GetEffect(), Aura::GetId(), Aura::GetMaxDuration(), GetSingleCastAuras(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), IN_MILLISECONDS, Aura::IsPermanent(), Aura::IsSingleTarget(), m_ownedAuras, MAX_SPELL_EFFECTS, MINUTE, Aura::ModCharges(), Aura::ModStackAmount(), Aura::SetIsSingleTarget(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, Aura::TryRefreshStackOrCreate(), and Aura::UnregisterSingleTarget().

Referenced by Spell::EffectStealBeneficialBuff().

◆ RemoveAurasWithAttribute()

void Unit::RemoveAurasWithAttribute ( uint32  flags)
5199{
5200 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5201 {
5202 SpellInfo const* spell = iter->second->GetBase()->GetSpellInfo();
5203 if (spell->Attributes & flags)
5204 RemoveAura(iter);
5205 else
5206 ++iter;
5207 }
5208}

References SpellInfo::Attributes, m_appliedAuras, and RemoveAura().

◆ RemoveAurasWithFamily()

void Unit::RemoveAurasWithFamily ( SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID 
)
5282{
5283 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5284 {
5285 Aura const* aura = iter->second->GetBase();
5286 if (!casterGUID || aura->GetCasterGUID() == casterGUID)
5287 {
5288 SpellInfo const* spell = aura->GetSpellInfo();
5289 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5290 {
5291 RemoveAura(iter);
5292 continue;
5293 }
5294 }
5295 ++iter;
5296 }
5297}

References Aura::GetCasterGUID(), Aura::GetSpellInfo(), flag96::HasFlag(), m_appliedAuras, RemoveAura(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by spell_warl_demonic_aegis::HandleAuraApply(), and Aura::HandleAuraSpecificMods().

◆ RemoveAurasWithInterruptFlags()

void Unit::RemoveAurasWithInterruptFlags ( uint32  flag,
uint32  except = 0,
bool  isAutoshot = false 
)
5247{
5248 if (!(m_interruptMask & flag))
5249 return;
5250
5251 // interrupt auras
5252 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end();)
5253 {
5254 Aura* aura = (*iter)->GetBase();
5255 ++iter;
5256 if ((aura->GetSpellInfo()->AuraInterruptFlags & flag) && (!except || aura->GetId() != except))
5257 {
5258 uint32 removedAuras = m_removedAurasCount;
5259 RemoveAura(aura);
5260 if (m_removedAurasCount > removedAuras + 1)
5261 iter = m_interruptableAuras.begin();
5262 }
5263 }
5264
5265 // interrupt channeled spell
5267 {
5268 if (spell->getState() == SPELL_STATE_CASTING && (spell->m_spellInfo->ChannelInterruptFlags & flag) && spell->m_spellInfo->Id != except)
5269 {
5270 // Do not interrupt if auto shot
5271 if (!(isAutoshot && spell->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS)))
5272 {
5273 InterruptNonMeleeSpells(false, spell->m_spellInfo->Id);
5274 }
5275 }
5276 }
5277
5279}

References SpellInfo::AuraInterruptFlags, CURRENT_CHANNELED_SPELL, Aura::GetId(), Aura::GetSpellInfo(), InterruptNonMeleeSpells(), m_currentSpells, m_interruptableAuras, m_interruptMask, m_removedAurasCount, RemoveAura(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_CASTING, and UpdateInterruptMask().

Referenced by _EnterVehicle(), AttackerStateUpdate(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealDamage(), Dismount(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundAB::EventPlayerClickedOnFlag(), spell_rog_killing_spree::FilterTargets(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleFeignDeath(), WorldSession::HandleGossipHelloOpcode(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModStealth(), AuraEffect::HandleModUnattackable(), WorldSession::HandleMovementOpcodes(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePhase(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), Mount(), Spell::prepare(), ProcessTerrainStatusUpdate(), Player::SetInWater(), SetStandState(), Player::TeleportTo(), and UpdatePosition().

◆ RemoveAurasWithMechanic()

void Unit::RemoveAurasWithMechanic ( uint32  mechanic_mask,
AuraRemoveMode  removemode = AURA_REMOVE_BY_DEFAULT,
uint32  except = 0 
)
5319{
5320 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5321 {
5322 Aura const* aura = iter->second->GetBase();
5323 if (!except || aura->GetId() != except)
5324 {
5325 if (aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask)
5326 {
5327 RemoveAura(iter, removemode);
5328 continue;
5329 }
5330 }
5331 ++iter;
5332 }
5333}

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetId(), Aura::GetSpellInfo(), m_appliedAuras, and RemoveAura().

Referenced by HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_rog_vanish_purge::HandleRootRemove(), spell_rog_vanish_purge::HandleSnareRemove(), and RemoveMovementImpairingAuras().

◆ RemoveBindSightAuras()

void Unit::RemoveBindSightAuras ( )
11285{
11287}
@ SPELL_AURA_BIND_SIGHT
Definition: SpellAuraDefines.h:64

References RemoveAurasByType(), and SPELL_AURA_BIND_SIGHT.

Referenced by RemoveFromWorld().

◆ RemoveCharmAuras()

void Unit::RemoveCharmAuras ( )

◆ RemoveCharmedBy()

void Unit::RemoveCharmedBy ( Unit charmer)
18650{
18651 if (!IsCharmed())
18652 return;
18653
18654 if (!charmer)
18655 charmer = GetCharmer();
18656 if (charmer != GetCharmer()) // one aura overrides another?
18657 {
18658 // LOG_FATAL("entities.unit", "Unit::RemoveCharmedBy: this: {} true charmer: {} false charmer: {}",
18659 // GetGUID().ToString(), GetCharmerGUID().ToString(), charmer->GetGUID().ToString());
18660 // ABORT();
18661 return;
18662 }
18663
18664 CharmType type;
18666 type = CHARM_TYPE_POSSESS;
18667 else if (charmer && charmer->IsOnVehicle(this))
18668 type = CHARM_TYPE_VEHICLE;
18669 else
18670 type = CHARM_TYPE_CHARM;
18671
18672 if (_oldFactionId)
18673 {
18675 _oldFactionId = 0;
18676 }
18677 else
18679
18680 CastStop();
18681 AttackStop();
18682
18683 // xinef: update speed after charming
18684 UpdateSpeed(MOVE_RUN, false);
18685
18686 // xinef: do not break any controlled motion slot
18687 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE)
18688 {
18689 StopMoving();
18691 }
18692 // xinef: if we have any controlled movement, clear active and idle only
18693 else
18695
18697
18698 // xinef: remove stunned flag if owner was mounted
18701
18702 // If charmer still exists
18703 if (!charmer)
18704 return;
18705
18706 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18707 ASSERT(type != CHARM_TYPE_VEHICLE || (IsCreature() && IsVehicle()));
18708
18709 charmer->SetCharm(this, false);
18710
18712
18713 Player* playerCharmer = charmer->ToPlayer();
18714 if (playerCharmer)
18715 {
18716 switch (type)
18717 {
18718 case CHARM_TYPE_VEHICLE:
18719 playerCharmer->SetClientControl(this, false);
18720 playerCharmer->SetClientControl(charmer, true); // verified
18723 break;
18724 case CHARM_TYPE_POSSESS:
18725 playerCharmer->SetClientControl(this, false);
18726 playerCharmer->SetClientControl(charmer, true); // verified
18731 break;
18732 case CHARM_TYPE_CHARM:
18734 {
18736 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18737 {
18739 if (GetCharmInfo())
18740 GetCharmInfo()->SetPetNumber(0, true);
18741 else
18742 LOG_ERROR("entities.unit", "Aura::HandleModCharm: target={} has a charm aura but no charm info!", GetGUID().ToString());
18743 }
18744 }
18745 break;
18746 default:
18747 break;
18748 }
18749 }
18750
18751 if (Player* player = ToPlayer())
18752 {
18753 sScriptMgr->AnticheatSetUnderACKmount(player);
18754 }
18755
18756 // xinef: restore threat
18757 for (CharmThreatMap::const_iterator itr = _charmThreatInfo.begin(); itr != _charmThreatInfo.end(); ++itr)
18758 {
18759 if (Unit* target = ObjectAccessor::GetUnit(*this, itr->first))
18760 if (!IsFriendlyTo(target))
18761 AddThreat(target, itr->second);
18762 }
18763
18764 _charmThreatInfo.clear();
18765
18766 if (Creature* creature = ToCreature())
18767 {
18768 // Vehicle should not attack its passenger after he exists the seat
18769 if (type != CHARM_TYPE_VEHICLE && charmer->IsAlive() && !charmer->IsFriendlyTo(creature))
18770 if (Attack(charmer, true))
18771 GetMotionMaster()->MoveChase(charmer);
18772
18773 // Creature will restore its old AI on next update
18774 if (creature->AI())
18775 creature->AI()->OnCharmed(false);
18776
18777 // Xinef: Remove movement flag flying
18779 }
18780 else
18781 ToPlayer()->SetClientControl(this, true); // verified
18782
18783 // a guardian should always have charminfo
18784 if (playerCharmer && this != charmer->GetFirstControlled())
18785 playerCharmer->SendRemoveControlBar();
18786
18787 // xinef: Always delete charm info (restores react state)
18788 if (IsPlayer() || (IsCreature() && !ToCreature()->IsGuardian()))
18790}
@ MOTION_SLOT_CONTROLLED
Definition: MotionMaster.h:65
@ MOTION_SLOT_ACTIVE
Definition: MotionMaster.h:64
@ NULL_MOTION_TYPE
Definition: MotionMaster.h:58
CharmType
Definition: CharmInfo.h:44
@ CHARM_TYPE_CHARM
Definition: CharmInfo.h:45
@ CHARM_TYPE_POSSESS
Definition: CharmInfo.h:46
@ CHARM_TYPE_VEHICLE
Definition: CharmInfo.h:47
@ CLASS_CONTEXT_PET_CHARM
Definition: UnitDefines.h:239
@ UNIT_STATE_NO_ENVIRONMENT_UPD
Definition: UnitDefines.h:198
@ MOVE_RUN
Definition: UnitDefines.h:352
@ UNIT_FLAG_DISABLE_MOVE
Definition: UnitDefines.h:254
@ CREATURE_TYPE_DEMON
Definition: SharedDefines.h:2641
uint32 unit_class
Definition: CreatureData.h:213
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition: Object.cpp:739
void SendRemoveControlBar()
Definition: Player.cpp:9798
void SetClientControl(Unit *target, bool allowMove, bool packetOnly=false)
Definition: Player.cpp:12879
void DeleteCharmInfo()
Definition: Unit.cpp:15906
void RestoreFaction()
Definition: Unit.cpp:18792
void SetCharm(Unit *target, bool apply)
Definition: Unit.cpp:10971
void StopAttackingInvalidTarget()
Definition: Unit.cpp:20033
void CastStop(uint32 except_spellid=0, bool withInstant=true)
Interrupt the unit cast for all the current spells.
Definition: Unit.cpp:1187
bool Attack(Unit *victim, bool meleeAttack)
Definition: Unit.cpp:10342
CharmThreatMap _charmThreatInfo
Definition: Unit.h:2112
void RemoveUnitMovementFlag(uint32 f)
Definition: Unit.h:728
void UpdateSpeed(UnitMoveType mtype, bool forced)
Definition: Unit.cpp:14351
void InitDefault()
Definition: MotionMaster.cpp:87
void MovementExpiredOnSlot(MovementSlot slot, bool reset=true)
Definition: MotionMaster.h:194
void MovementExpired(bool reset=true)
Definition: MotionMaster.h:180

References _charmThreatInfo, _oldFactionId, AddThreat(), ASSERT, Attack(), AttackStop(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, CLASS_CONTEXT_PET_CHARM, CLASS_WARLOCK, ClearUnitState(), CREATURE_TYPE_DEMON, DeleteCharmInfo(), GetCharmer(), GetCharmInfo(), Creature::GetCreatureTemplate(), GetFirstControlled(), Object::GetGUID(), GetMotionMaster(), ObjectAccessor::GetUnit(), HasUnitState(), MotionMaster::InitDefault(), IsAlive(), IsCharmed(), IsClass(), Object::IsCreature(), IsFriendlyTo(), IsGuardian(), IsOnVehicle(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MOTION_SLOT_ACTIVE, MOTION_SLOT_CONTROLLED, MOVE_RUN, MotionMaster::MoveChase(), MotionMaster::MovementExpired(), MotionMaster::MovementExpiredOnSlot(), MOVEMENTFLAG_FLYING, NULL_MOTION_TYPE, RemoveUnitFlag(), RemoveUnitMovementFlag(), RestoreFaction(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), sScriptMgr, StopAttackingInvalidTarget(), StopMoving(), Object::ToCreature(), Object::ToPlayer(), Position::ToString(), CreatureTemplate::type, CreatureTemplate::unit_class, UNIT_FIELD_BYTES_0, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_FLAG_STUNNED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, UNIT_STATE_STUNNED, and UpdateSpeed().

Referenced by AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), npc_chesspiece::JustDied(), Puppet::RemoveFromWorld(), Vehicle::RemovePassenger(), and npc_chesspiece::sGossipSelect().

◆ RemoveComboPointHolder()

void Unit::RemoveComboPointHolder ( Unit unit)
inline
965{ m_ComboPointHolders.erase(unit); }

References m_ComboPointHolders.

Referenced by AddComboPoints(), and ClearComboPoints().

◆ RemoveDynObject()

bool Unit::RemoveDynObject ( uint32  spellId)
6238{
6239 if (m_dynObj.empty())
6240 return false;
6241
6242 bool result = false;
6243 for (DynObjectList::iterator i = m_dynObj.begin(); i != m_dynObj.end();)
6244 {
6245 DynamicObject* dynObj = *i;
6246 if (dynObj->GetSpellId() == spellId)
6247 {
6248 dynObj->Remove();
6249 i = m_dynObj.begin();
6250 result = true;
6251 }
6252 else
6253 ++i;
6254 }
6255
6256 return result;
6257}
void Remove()
Definition: DynamicObject.cpp:180

References DynamicObject::GetSpellId(), m_dynObj, and DynamicObject::Remove().

Referenced by Spell::cancel(), Spell::EffectAddFarsight(), and spell_item_shifting_naaru_silver::OnBaseRemove().

◆ RemoveEvadeAuras()

void Unit::RemoveEvadeAuras ( )
5503{
5504 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5505 {
5506 Aura const* aura = iter->second->GetBase();
5507 SpellInfo const* spellInfo = aura->GetSpellInfo();
5509 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5510 ++iter;
5511 else
5513 }
5514
5515 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5516 {
5517 Aura* aura = iter->second;
5518 SpellInfo const* spellInfo = aura->GetSpellInfo();
5520 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5521 ++iter;
5522 else
5524 }
5525}
@ SPELL_ATTR0_CU_IGNORE_EVADE
Definition: SpellInfo.h:187
@ SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT
Definition: SharedDefines.h:455

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, GetOwnerGUID(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), Aura::IsPassive(), Object::IsPlayer(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CLONE_CASTER, and SPELL_AURA_CONTROL_VEHICLE.

Referenced by CreatureAI::_EnterEvadeMode(), and npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode().

◆ RemoveExtraUnitMovementFlag()

void Unit::RemoveExtraUnitMovementFlag ( uint16  f)
inline

◆ removeFollower()

void Unit::removeFollower ( FollowerReference )
inline
1811{ /* nothing to do yet */ }

Referenced by FollowerReference::targetObjectDestroyLink().

◆ RemoveFromWorld()

void Unit::RemoveFromWorld ( )
overridevirtual

Reimplemented from WorldObject.

15784{
15785 // cleanup
15786 ASSERT(GetGUID());
15787
15788 if (IsInWorld())
15789 {
15791 if (IsVehicle())
15793
15797
15800
15801 ExitVehicle(); // Remove applied auras with SPELL_AURA_CONTROL_VEHICLE
15804
15806
15807 if (GetCharmerGUID())
15808 {
15809 LOG_FATAL("entities.unit", "Unit {} has charmer guid when removed from world", GetEntry());
15810 ABORT();
15811 }
15812
15813 if (Unit* owner = GetOwner())
15814 {
15815 if (owner->m_Controlled.find(this) != owner->m_Controlled.end())
15816 {
15818 owner->SetMinion((Minion*)this, false);
15819 LOG_INFO("entities.unit", "Unit {} is in controlled list of {} when removed from world", GetEntry(), owner->GetEntry());
15820 //ABORT();
15821 }
15822 }
15823
15826 }
15827}
void RemoveFromWorld() override
Definition: Object.cpp:1182
void RemoveNotOwnSingleTargetAuras()
Definition: Unit.cpp:5210
void UnsummonAllTotems(bool onDeath=false)
Definition: Unit.cpp:11297
void RemoveAllDynObjects()
Definition: Unit.cpp:6259
void RemoveAreaAurasDueToLeaveWorld()
Definition: Unit.cpp:5351
void RemoveBindSightAuras()
Definition: Unit.cpp:11284
void RemoveAllControlled(bool onDeath=false)
Definition: Unit.cpp:11181

References ABORT, ASSERT, ExitVehicle(), GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwner(), HasUnitTypeMask(), Object::IsInWorld(), IsVehicle(), LOG_FATAL, LOG_INFO, m_duringRemoveFromWorld, RemoveAllControlled(), RemoveAllDynObjects(), RemoveAllGameObjects(), RemoveAreaAurasDueToLeaveWorld(), RemoveBindSightAuras(), RemoveCharmAuras(), WorldObject::RemoveFromWorld(), RemoveNotOwnSingleTargetAuras(), RemoveVehicleKit(), UNIT_MASK_GUARDIAN, UNIT_MASK_MINION, and UnsummonAllTotems().

Referenced by CleanupBeforeRemoveFromMap(), Creature::RemoveFromWorld(), Pet::RemoveFromWorld(), and Player::RemoveFromWorld().

◆ RemoveGameObject() [1/2]

void Unit::RemoveGameObject ( GameObject gameObj,
bool  del 
)
6294{
6295 if (!gameObj || gameObj->GetOwnerGUID() != GetGUID())
6296 return;
6297
6299
6300 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
6301 {
6302 if (m_ObjectSlot[i] == gameObj->GetGUID())
6303 {
6304 m_ObjectSlot[i].Clear();
6305 break;
6306 }
6307 }
6308
6309 // GO created by some spell
6310 if (uint32 spellid = gameObj->GetSpellId())
6311 {
6312 RemoveAurasDueToSpell(spellid);
6313
6314 if (IsPlayer())
6315 {
6316 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(spellid);
6317 // Need activate spell use for owner
6318 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6319 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6320 ToPlayer()->SendCooldownEvent(createBySpell);
6321 }
6322 }
6323
6324 m_gameObj.remove(gameObj->GetGUID());
6325
6326 if (del)
6327 {
6328 gameObj->SetRespawnTime(0);
6329 gameObj->Delete();
6330 }
6331}
void Clear()
Definition: ObjectGuid.h:138
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition: Player.cpp:11144

References ObjectGuid::Clear(), GameObject::Delete(), ObjectGuid::Empty, Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, m_ObjectSlot, MAX_GAMEOBJECT_SLOT, RemoveAurasDueToSpell(), Player::SendCooldownEvent(), GameObject::SetOwnerGUID(), GameObject::SetRespawnTime(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::cancel(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), Spell::EffectSummonObject(), gobject_commandscript::HandleGameObjectDeleteCommand(), spell_warl_demonic_circle_summon::HandleRemove(), boss_kologarn::boss_kologarnAI::JustDied(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), GameObject::Update(), and npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI().

◆ RemoveGameObject() [2/2]

void Unit::RemoveGameObject ( uint32  spellid,
bool  del 
)
6334{
6335 if (m_gameObj.empty())
6336 return;
6337
6338 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
6339 {
6340 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6341 {
6342 if (spellid > 0 && go->GetSpellId() != spellid)
6343 {
6344 ++itr;
6345 continue;
6346 }
6347
6348 go->SetOwnerGUID(ObjectGuid::Empty);
6349 if (del)
6350 {
6351 go->SetRespawnTime(0);
6352 go->Delete();
6353 }
6354 }
6355 m_gameObj.erase(itr++);
6356 }
6357}

References ObjectGuid::Empty, ObjectAccessor::GetGameObject(), and m_gameObj.

◆ removeHatedBy()

void Unit::removeHatedBy ( HostileReference )
inline
903{ /* nothing to do yet */ }

Referenced by HostileReference::targetObjectDestroyLink().

◆ RemoveMovementImpairingAuras()

void Unit::RemoveMovementImpairingAuras ( bool  withRoot)
5300{
5301 if (withRoot)
5303
5304 // Snares
5305 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5306 {
5307 Aura const* aura = iter->second->GetBase();
5309 {
5310 RemoveAura(iter);
5311 continue;
5312 }
5313
5314 ++iter;
5315 }
5316}
bool HasEffectMechanic(Mechanics mechanic) const
Definition: SpellInfo.cpp:884

References Aura::GetSpellInfo(), SpellInfo::HasEffectMechanic(), m_appliedAuras, SpellInfo::Mechanic, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), and RemoveAurasWithMechanic().

Referenced by Spell::CheckCast(), Spell::EffectTriggerSpell(), HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), and spell_gen_remove_impairing_auras::HandleScriptEffect().

◆ RemoveNotOwnSingleTargetAuras()

void Unit::RemoveNotOwnSingleTargetAuras ( )
5211{
5212 // single target auras from other casters
5213 // Iterate m_ownedAuras - aura is marked as single target in Unit::AddAura (and pushed to m_ownedAuras).
5214 // m_appliedAuras will NOT contain the aura before first Unit::Update after adding it to m_ownedAuras.
5215 // Quickly removing such an aura will lead to it not being unregistered from caster's single cast auras container
5216 // leading to assertion failures if the aura was cast on a player that can
5217 // (and is changing map at the point where this function is called).
5218 // Such situation occurs when player is logging in inside an instance and fails the entry check for any reason.
5219 // The aura that was loaded from db (indirectly, via linked casts) gets removed before it has a chance
5220 // to register in m_appliedAuras
5221 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5222 {
5223 Aura const* aura = iter->second;
5224
5225 if (aura->GetCasterGUID() != GetGUID() && aura->IsSingleTarget())
5226 RemoveOwnedAura(iter);
5227 else
5228 ++iter;
5229 }
5230
5231 // single target auras at other targets
5232 AuraList& scAuras = GetSingleCastAuras();
5233 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
5234 {
5235 Aura* aura = *iter;
5236 if (aura->GetUnitOwner() != this)
5237 {
5238 aura->Remove();
5239 iter = scAuras.begin();
5240 }
5241 else
5242 ++iter;
5243 }
5244}

References Aura::GetCasterGUID(), Object::GetGUID(), GetSingleCastAuras(), Aura::GetUnitOwner(), Aura::IsSingleTarget(), m_ownedAuras, Aura::Remove(), and RemoveOwnedAura().

Referenced by RemoveFromWorld().

◆ RemoveNpcFlag()

void Unit::RemoveNpcFlag ( NPCFlags  flags)
inline
720{ RemoveFlag(UNIT_NPC_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), boss_vaelastrasz::boss_vaelAI::BeginSpeech(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_fos_leader::npc_fos_leaderAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_akama_illidan::DoAction(), spell_q12096_q12092_dummy::HandleDummy(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), npc_precious::npc_preciousAI::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), npc_fos_leader_second::npc_fos_leader_secondAI::npc_fos_leader_secondAI(), npc_pos_leader_second::npc_pos_leader_secondAI::npc_pos_leader_secondAI(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_announcer_toc10::OnGossipHello(), npc_hyjal_jaina::OnGossipSelect(), npc_hyjal_thrall::OnGossipSelect(), boss_doomrel::OnGossipSelect(), boss_majordomo::OnGossipSelect(), npc_zulaman_hostage::OnGossipSelect(), npc_arthas::OnGossipSelect(), npc_ulduar_keeper::OnGossipSelect(), npc_announcer_toc5::OnGossipSelect(), npc_announcer_toc10::OnGossipSelect(), npc_hor_leader::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_thrall_old_hillsbrad::OnGossipSelect(), npc_hor_leader_second::OnGossipSelect(), npc_battle_at_valhalas::OnQuestAccept(), npc_riggle_bassbait::OnQuestReward(), NPCStaveQuestAI::PrepareForEncounter(), RemoveVehicleKit(), boss_majordomo::boss_majordomoAI::Reset(), npc_arthas::npc_arthasAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), npc_xerestrasza::npc_xerestraszaAI::Reset(), npc_tirion_fordring_tft::npc_tirion_fordringAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_lake_frog::npc_lake_frogAI::Reset(), npc_akama_illidan::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_magister_aledis::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::sGossipSelect(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::sGossipSelect(), boss_apothecary_hummel::boss_apothecary_hummelAI::sGossipSelect(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_general_andorov::sGossipSelect(), npc_akama_shade::sGossipSelect(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_chesspiece::SpellHitTarget(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_deathstalker_fearleia::sQuestAccept(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), npc_magister_aledis::StartFight(), npc_cork_gizelton::npc_cork_gizeltonAI::SummonHelpers(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), and Vehicle::Vehicle().

◆ RemoveOwnedAura() [1/3]

void Unit::RemoveOwnedAura ( Aura aura,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4804{
4805 if (aura->IsRemoved())
4806 return;
4807
4808 ASSERT(aura->GetOwner() == this);
4809
4810 uint32 spellId = aura->GetId();
4811 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4812
4813 for (AuraMap::iterator itr = range.first; itr != range.second; ++itr)
4814 {
4815 if (itr->second == aura)
4816 {
4817 RemoveOwnedAura(itr, removeMode);
4818 return;
4819 }
4820 }
4821
4822 ABORT();
4823}

References ABORT, ASSERT, Aura::GetId(), Aura::GetOwner(), Aura::IsRemoved(), m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAura() [2/3]

void Unit::RemoveOwnedAura ( AuraMap::iterator &  i,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4771{
4772 Aura* aura = i->second;
4773 ASSERT(!aura->IsRemoved());
4774
4775 // if unit currently update aura list then make safe update iterator shift to next
4778
4779 m_ownedAuras.erase(i);
4780 m_removedAuras.push_back(aura);
4781
4782 // Unregister single target aura
4783 if (aura->IsSingleTarget())
4784 aura->UnregisterSingleTarget();
4785
4786 aura->_Remove(removeMode);
4787
4788 i = m_ownedAuras.begin();
4789}
void _Remove(AuraRemoveMode removeMode)
Definition: SpellAuras.cpp:574

References Aura::_Remove(), ASSERT, Aura::IsRemoved(), Aura::IsSingleTarget(), m_auraUpdateIterator, m_ownedAuras, m_removedAuras, and Aura::UnregisterSingleTarget().

Referenced by Player::_removeTalentAurasAndSpells(), _UpdateSpells(), Player::ActivateSpec(), Spell::EffectApplyGlyph(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandleRemoveGlyph(), AuraEffect::HandleShapeshiftBoosts(), boss_zuljin::JustEngagedWith(), spell_gen_animal_blood::OnApply(), spell_contagion_of_rot::OnApply(), UnitAura::Remove(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAurasDueToItemSpell(), RemoveEvadeAuras(), Player::RemoveItemDependentAurasAndCasts(), RemoveNotOwnSingleTargetAuras(), RemoveOwnedAura(), RemoveOwnedAuras(), Player::removeSpell(), boss_falric::boss_falricAI::UpdateAI(), and Player::UpdateAreaDependentAuras().

◆ RemoveOwnedAura() [3/3]

void Unit::RemoveOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4792{
4793 for (AuraMap::iterator itr = m_ownedAuras.lower_bound(spellId); itr != m_ownedAuras.upper_bound(spellId);)
4794 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask) && (!casterGUID || itr->second->GetCasterGUID() == casterGUID))
4795 {
4796 RemoveOwnedAura(itr, removeMode);
4797 itr = m_ownedAuras.lower_bound(spellId);
4798 }
4799 else
4800 ++itr;
4801}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [1/2]

void Unit::RemoveOwnedAuras ( std::function< bool(Aura const *)> const &  check)
4923{
4924 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
4925 {
4926 if (check(iter->second))
4927 {
4928 RemoveOwnedAura(iter);
4929 continue;
4930 }
4931 ++iter;
4932 }
4933}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [2/2]

void Unit::RemoveOwnedAuras ( uint32  spellId,
std::function< bool(Aura const *)> const &  check 
)
4949{
4950 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
4951 {
4952 if (check(iter->second))
4953 {
4954 RemoveOwnedAura(iter);
4955 continue;
4956 }
4957 ++iter;
4958 }
4959}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemovePetAura()

void Unit::RemovePetAura ( PetAura const *  petSpell)
17393{
17394 if (!IsPlayer())
17395 return;
17396
17397 m_petAuras.erase(petSpell);
17398 if (Pet* pet = ToPlayer()->GetPet())
17399 pet->RemoveAurasDueToSpell(petSpell->GetAura(pet->GetEntry()));
17400 if (Unit* charm = GetCharm())
17401 charm->RemoveAurasDueToSpell(petSpell->GetAura(charm->GetEntry()));
17402}

References PetAura::GetAura(), GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Player::_removeTalentAurasAndSpells(), Pet::CastPetAuras(), AuraEffect::HandleAuraDummy(), and Player::removeSpell().

◆ RemovePlayerFromVision()

void Unit::RemovePlayerFromVision ( Player player)
Todo:
: This isn't right, if a previously active object was set to active with e.g. Mind Vision this will make them no longer active
11275{
11276 m_sharedVision.remove(player);
11277 player->m_isInSharedVisionOf.erase(this);
11278
11280 if (m_sharedVision.empty())
11281 setActive(false);
11282}

References Player::m_isInSharedVisionOf, m_sharedVision, and WorldObject::setActive().

Referenced by Player::SetViewpoint(), and Player::~Player().

◆ RemovePointedBy()

void Unit::RemovePointedBy ( SafeUnitPointer sup)
inline

◆ RemoveStandFlags()

void Unit::RemoveStandFlags ( uint8  flags)
inline
@ UNIT_BYTES_1_OFFSET_VIS_FLAG
Definition: UnitDefines.h:25
void RemoveByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition: Object.cpp:919

References Object::RemoveByteFlag(), UNIT_BYTES_1_OFFSET_VIS_FLAG, and UNIT_FIELD_BYTES_1.

Referenced by AuraEffect::HandleModStealth(), Player::InitStatsForLevel(), and npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI().

◆ RemoveUnitFlag()

void Unit::RemoveUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

704{ RemoveFlag(UNIT_FIELD_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_FIELD_FLAGS.

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), Player::BuildPlayerRepop(), boss_thekal::CheckPhaseTransition(), Player::CleanupAfterTaxiFlight(), ClearInCombat(), ClearInPetCombat(), boss_alar::DamageTaken(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), Dismount(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_thekal::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_the_lurker_below::DoAction(), npc_frozen_core::DoAction(), boss_broggok::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_cthun::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DoAction(), boss_essence_of_desire::boss_essence_of_desireAI::DoAction(), boss_essence_of_anger::boss_essence_of_angerAI::DoAction(), boss_kelidan_the_breaker::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), HomeMovementGenerator< Creature >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), WorldSession::DoLootRelease(), Spell::EffectResurrectPet(), Spell::EffectSkinning(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_bronjahm::boss_bronjahmAI::EnterEvadeMode(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), boss_kelthuzad::boss_kelthuzadAI::EnterEvadeMode(), boss_malygos::boss_malygosAI::EnterEvadeMode(), boss_ymiron::boss_ymironAI::EnterEvadeMode(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), SACActivateEvent::Execute(), boss_ingvar_the_plunderer::FeignDeath(), TimedFleeingMovementGenerator::Finalize(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_feign_death_all_flags::HandleEffectRemove(), spell_gen_feign_death_no_dyn_flag::HandleEffectRemove(), spell_gen_feign_death_no_prevent_emotes::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLogoutCancelOpcode(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), WorldSession::HandlePlayerLoginToCharInWorld(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_kiljaeden::InitializeAI(), boss_jarien::IsSummonedBy(), boss_sothos::IsSummonedBy(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), boss_volazj::JustDied(), boss_ichoron::boss_ichoronAI::JustDied(), boss_taerar::boss_taerarAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_ymiron::boss_ymironAI::JustEngagedWith(), boss_hazzarah::JustSummoned(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), boss_shade_of_akama::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), npc_death_knight_initiate::OnGossipSelect(), npc_bessy::OnQuestAccept(), spell_halion_twilight_phasing_aura::OnRemove(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), RemoveCharmedBy(), Vehicle::RemovePassenger(), boss_keristrasza::RemovePrison(), boss_lord_valthalak::boss_lord_valthalakAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_crone::Reset(), boss_julianne::Reset(), boss_kalecgos::Reset(), boss_kiljaeden::Reset(), boss_muru::Reset(), npc_harrison_jones::Reset(), npc_amanishi_lookout::Reset(), boss_eye_of_cthun::Reset(), boss_volazj::Reset(), boss_anub_arak::boss_anub_arakAI::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_novos::boss_novosAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_kelthuzad::boss_kelthuzadAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_crystalline_frayer::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_mimiron::boss_mimironAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_skadi::boss_skadiAI::Reset(), boss_svala::boss_svalaAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), boss_ichoron::boss_ichoronAI::Reset(), npc_wounded_skirmisher::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), boss_leotheras_the_blind::Reset(), npc_shattered_hand_scout::Reset(), boss_kaelthas::Reset(), advisor_baseAI::Reset(), emerald_dragonAI::Reset(), npc_doctor::npc_doctorAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Resurrect(), boss_magtheridon::ScheduleCombatEvents(), boss_the_lurker_below::SchedulerPhaseTwo(), SetCharm(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SetData(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SetData(), Pet::setDeathState(), SetImmuneToNPC(), SetImmuneToPC(), Player::SetIsSpectator(), SetStunned(), SetSwim(), Battlefield::ShowNpc(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SpellHit(), npc_ulduar_vx001::npc_ulduar_vx001AI::SpellHit(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SpellHit(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), advisor_baseAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), boss_lord_valthalak::boss_lord_valthalakAI::StartFighting(), boss_noth::boss_nothAI::StartGroundPhase(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), and npc_general_andorov::WaypointReached().

◆ RemoveUnitFlag2()

◆ RemoveUnitMovementFlag()

◆ RemoveVehicleKit()

void Unit::RemoveVehicleKit ( )
18825{
18826 if (!m_vehicleKit)
18827 return;
18828
18830 delete m_vehicleKit;
18831
18832 m_vehicleKit = nullptr;
18833
18834 m_updateFlag &= ~UPDATEFLAG_VEHICLE;
18835 m_unitTypeMask &= ~UNIT_MASK_VEHICLE;
18837}
@ UNIT_NPC_FLAG_SPELLCLICK
Definition: UnitDefines.h:341
@ UNIT_NPC_FLAG_PLAYER_VEHICLE
Definition: UnitDefines.h:342
void RemoveNpcFlag(NPCFlags flags)
Definition: Unit.h:720

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, RemoveNpcFlag(), Vehicle::Uninstall(), UNIT_NPC_FLAG_PLAYER_VEHICLE, and UNIT_NPC_FLAG_SPELLCLICK.

Referenced by Dismount(), AuraEffect::HandleAuraSetVehicle(), npc_gunship::npc_gunshipAI::JustDied(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), and RemoveFromWorld().

◆ RemoveVisibleAura()

void Unit::RemoveVisibleAura ( uint8  slot)
inline
1469{ m_visibleAuras.erase(slot); UpdateAuraForGroup(slot);}
void UpdateAuraForGroup(uint8 slot)
Definition: Unit.cpp:17252

References m_visibleAuras, and UpdateAuraForGroup().

Referenced by AuraApplication::_Remove().

◆ ReplaceAllDynamicFlags()

◆ ReplaceAllNpcFlags()

void Unit::ReplaceAllNpcFlags ( NPCFlags  flags)
inline

References SetUInt32Value(), and UNIT_NPC_FLAGS.

Referenced by Pet::CreateBaseAtTamed(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), Spell::EffectSummonType(), SmartAI::EndPath(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFlagCommand(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_akama_illidan::JustSummoned(), Pet::LoadPetFromDB(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_shandy_dalaran::OnGossipSelect(), go_crystalline_tear::OnQuestAccept(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), boss_doomrel::boss_doomrelAI::Reset(), npc_eris_hevenfire::npc_eris_hevenfireAI::Reset(), npc_taretha::npc_tarethaAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Creature::setDeathState(), npc_eris_hevenfire::npc_eris_hevenfireAI::SetGUID(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_akama_illidan::sGossipSelect(), npc_escortAI::Start(), FollowerAI::StartFollow(), SmartAI::StartPath(), Player::SummonPet(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), Creature::UpdateEntry(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), and npc_captain_saeed::npc_captain_saeedAI::WaypointReached().

◆ ReplaceAllUnitFlags()

◆ ReplaceAllUnitFlags2()

void Unit::ReplaceAllUnitFlags2 ( UnitFlags2  flags)
inline

◆ resetAttackTimer()

◆ ResetRedirectThreat()

◆ RespondsToCallForHelp()

bool Unit::RespondsToCallForHelp ( ) const
inline
978 {
980 return entry->FactionRespondsToCallForHelp();
981
982 return false;
983 }

References GetFactionTemplateEntry().

Referenced by Creature::CanAssistTo().

◆ RestoreDisplayId()

void Unit::RestoreDisplayId ( )
16859{
16860 AuraEffect* handledAura = nullptr;
16861 AuraEffect* handledAuraForced = nullptr;
16862 // try to receive model from transform auras
16864 if (!transforms.empty())
16865 {
16866 // iterate over already applied transform auras - from newest to oldest
16867 for (auto i = transforms.rbegin(); i != transforms.rend(); ++i)
16868 {
16869 if (AuraApplication const* aurApp = (*i)->GetBase()->GetApplicationOfTarget(GetGUID()))
16870 {
16871 if (!handledAura)
16872 handledAura = (*i);
16873 // xinef: prefer negative/forced auras
16874 if ((*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) || !aurApp->IsPositive())
16875 {
16876 handledAuraForced = (*i);
16877 break;
16878 }
16879 }
16880 }
16881 }
16882
16883 // Xinef: include clone auras (eg mirror images)
16884 if (!handledAuraForced && !handledAura)
16885 {
16887 if (!cloneAuras.empty())
16888 for (Unit::AuraEffectList::const_iterator i = cloneAuras.begin(); i != cloneAuras.end(); ++i)
16889 handledAura = *i;
16890 }
16891
16893
16894 // xinef: order of execution is important!
16895 // first forced transform auras, then shapeshifts, then normal transform
16896 // transform aura was found
16897 if (handledAuraForced)
16898 {
16899 handledAuraForced->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
16900 return;
16901 }
16902 else if (!shapeshiftAura.empty()) // we've found shapeshift
16903 {
16904 // only one such aura possible at a time
16905 if (uint32 modelId = GetModelForForm(GetShapeshiftForm(), shapeshiftAura.front()->GetId()))
16906 {
16907 SetDisplayId(modelId);
16908 return;
16909 }
16910 }
16911 else if (handledAura)
16912 {
16913 handledAura->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
16914 return;
16915 }
16916
16917 // no auras found - set modelid to default
16919}
@ AURA_EFFECT_HANDLE_SEND_FOR_CLIENT
Definition: SpellAuraDefines.h:43
uint32 GetModelForForm(ShapeshiftForm form, uint32 spellId)
Definition: Unit.cpp:19297
void HandleEffect(AuraApplication *aurApp, uint8 mode, bool apply)
Definition: SpellAuraEffects.cpp:748

References AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, Aura::GetApplicationOfTarget(), GetAuraEffectsByType(), AuraApplication::GetBase(), Object::GetGUID(), GetModelForForm(), GetNativeDisplayId(), GetShapeshiftForm(), AuraEffect::HandleEffect(), SetDisplayId(), SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_CLONE_CASTER, SPELL_AURA_MOD_SHAPESHIFT, and SPELL_AURA_TRANSFORM.

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), spell_gen_aura_service_uniform::OnRemove(), and Player::SetIsSpectator().

◆ RestoreFaction()

void Unit::RestoreFaction ( )
18793{
18794 if (IsPlayer())
18796 else
18797 {
18799 {
18800 if (Unit* owner = GetOwner())
18801 {
18802 SetFaction(owner->GetFaction());
18803 return;
18804 }
18805 }
18806
18807 if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate()) // normal creature
18808 SetFaction(cinfo->faction);
18809 }
18810}
void SetFactionForRace(uint8 race)
Definition: Player.cpp:5885

References GetOwner(), getRace(), HasUnitTypeMask(), Object::IsPlayer(), SetFaction(), Player::SetFactionForRace(), Object::ToCreature(), Object::ToPlayer(), and UNIT_MASK_MINION.

Referenced by npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thekal::DoAction(), AuraEffect::HandleAuraModFaction(), npc_commandscript::HandleNpcSetOriginalFaction(), npc_enslaved_netherwing_drake::JustDied(), npc_escortAI::JustRespawned(), SmartAI::JustRespawned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), RemoveCharmedBy(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_ahnqiraji_critter::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_magister_aledis::Reset(), npc_captain_saeed::npc_captain_saeedAI::Reset(), npc_bessy::npc_bessyAI::Reset(), and npc_enslaved_netherwing_drake::Reset().

◆ ResumeMovement()

void Unit::ResumeMovement ( uint32  timer = 0,
uint8  slot = 0 
)
16764{
16765 if (slot >= MAX_MOTION_SLOT)
16766 return;
16767
16768 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16769 movementGenerator->Resume(timer);
16770}

References GetMotionMaster(), and MAX_MOTION_SLOT.

Referenced by boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), and npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI().

◆ RewardRage()

void Unit::RewardRage ( uint32  damage,
uint32  weaponSpeedHitFactor,
bool  attacker 
)
19967{
19968 // Rage formulae https://wowwiki-archive.fandom.com/wiki/Rage#Formulae
19969 float addRage;
19970
19971 float rageconversion = ((0.0091107836f * GetLevel() * GetLevel()) + 3.225598133f * GetLevel()) + 4.2652911f;
19972
19973 // Unknown if correct, but lineary adjust rage conversion above level 70
19974 if (GetLevel() > 70)
19975 rageconversion += 13.27f * (GetLevel() - 70);
19976
19977 if (attacker)
19978 {
19979 // see Bornak's bluepost explanation (05/29/2009)
19980 float rageFromDamageDealt = damage / rageconversion * 7.5f;
19981 addRage = (rageFromDamageDealt + weaponSpeedHitFactor) / 2.0f;
19982 addRage = std::min(addRage, rageFromDamageDealt * 2.0f);
19984 }
19985 else
19986 {
19987 addRage = damage / rageconversion * 2.5f;
19988
19989 // Berserker Rage effect
19990 if (HasAura(18499))
19991 addRage *= 3.0f;
19992 }
19993
19994 addRage *= sWorld->getRate(RATE_POWER_RAGE_INCOME);
19995
19996 ModifyPower(POWER_RAGE, uint32(addRage * 10));
19997}
@ SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT
Definition: SpellAuraDefines.h:276
@ RATE_POWER_RAGE_INCOME
Definition: WorldConfig.h:390

References AddPct(), GetLevel(), GetTotalAuraModifier(), HasAura(), ModifyPower(), POWER_RAGE, RATE_POWER_RAGE_INCOME, SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT, and sWorld.

Referenced by DealDamage(), and DealMeleeDamage().

◆ RollMeleeOutcomeAgainst() [1/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType 
) const
2818{
2819 // This is only wrapper
2820
2821 // Miss chance based on melee
2822 //float miss_chance = MeleeMissChanceCalc(victim, attType);
2823 float miss_chance = MeleeSpellMissChance(victim, attType, int32(GetWeaponSkillValue(attType, victim)) - int32(victim->GetMaxSkillValueForLevel(this)), 0);
2824
2825 // Critical hit chance
2826 float crit_chance = GetUnitCriticalChance(attType, victim);
2827 if (crit_chance < 0)
2828 crit_chance = 0;
2829
2830 float dodge_chance = victim->GetUnitDodgeChance();
2831 float block_chance = victim->GetUnitBlockChance();
2832 float parry_chance = victim->GetUnitParryChance();
2833
2834 // Useful if want to specify crit & miss chances for melee, else it could be removed
2835 //LOG_DEBUG("entities.unit", "MELEE OUTCOME: miss {} crit {} dodge {} parry {} block {}", miss_chance, crit_chance, dodge_chance, parry_chance, block_chance);
2836
2837 return RollMeleeOutcomeAgainst(victim, attType, int32(crit_chance * 100), int32(miss_chance * 100), int32(dodge_chance * 100), int32(parry_chance * 100), int32(block_chance * 100));
2838}
float GetUnitCriticalChance(WeaponAttackType attackType, Unit const *victim) const
Definition: Unit.cpp:3762

References GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetUnitCriticalChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), MeleeSpellMissChance(), and RollMeleeOutcomeAgainst().

Referenced by CalculateMeleeDamage(), and RollMeleeOutcomeAgainst().

◆ RollMeleeOutcomeAgainst() [2/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType,
int32  crit_chance,
int32  miss_chance,
int32  dodge_chance,
int32  parry_chance,
int32  block_chance 
) const
2841{
2842 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks())
2843 {
2844 return MELEE_HIT_EVADE;
2845 }
2846
2847 int32 attackerMaxSkillValueForLevel = GetMaxSkillValueForLevel(victim);
2848 int32 victimMaxSkillValueForLevel = victim->GetMaxSkillValueForLevel(this);
2849
2850 int32 attackerWeaponSkill = GetWeaponSkillValue(attType, victim);
2851 int32 victimDefenseSkill = victim->GetDefenseSkillValue(this);
2852
2853 sScriptMgr->OnBeforeRollMeleeOutcomeAgainst(this, victim, attType, attackerMaxSkillValueForLevel, victimMaxSkillValueForLevel, attackerWeaponSkill, victimDefenseSkill, crit_chance, miss_chance, dodge_chance, parry_chance, block_chance);
2854
2855 // bonus from skills is 0.04%
2856 int32 skillBonus = 4 * (attackerWeaponSkill - victimMaxSkillValueForLevel);
2857 int32 sum = 0, tmp = 0;
2858 int32 roll = urand (0, 10000);
2859
2860 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: skill bonus of {} for attacker", skillBonus);
2861 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: rolled {}, miss {}, dodge {}, parry {}, block {}, crit {}",
2862 // roll, miss_chance, dodge_chance, parry_chance, block_chance, crit_chance);
2863
2864 tmp = miss_chance;
2865
2866 if (tmp > 0 && roll < (sum += tmp))
2867 {
2868 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: MISS");
2869 return MELEE_HIT_MISS;
2870 }
2871
2872 // Dodge chance
2873
2874 // only players can't dodge if attacker is behind
2875 if (victim->IsPlayer() && !victim->HasInArc(M_PI, this) && !victim->HasIgnoreHitDirectionAura())
2876 {
2877 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind and victim was a player.");
2878 }
2879 // Xinef: do not allow to dodge with CREATURE_FLAG_EXTRA_NO_DODGE flag
2880 else if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_DODGE)))
2881 {
2882 // Reduce dodge chance by attacker expertise rating
2883 if (IsPlayer())
2884 dodge_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2885 else
2886 dodge_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2887
2888 // Modify dodge chance by attacker SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
2890 dodge_chance = int32 (float (dodge_chance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
2891
2892 tmp = dodge_chance;
2893
2894 // xinef: if casting or stunned - cant dodge
2895 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2896 tmp = 0;
2897
2898 if ((tmp > 0) // check if unit _can_ dodge
2899 && ((tmp -= skillBonus) > 0)
2900 && roll < (sum += tmp))
2901 {
2902 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: DODGE <{}, {})", sum - tmp, sum);
2903 return MELEE_HIT_DODGE;
2904 }
2905 }
2906
2907 // parry & block chances
2908
2909 // check if attack comes from behind, nobody can parry or block if attacker is behind
2910 if (!victim->HasInArc(M_PI, this) && !victim->HasIgnoreHitDirectionAura())
2911 {
2912 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind.");
2913 }
2914 else
2915 {
2916 // Reduce parry chance by attacker expertise rating
2917 if (IsPlayer())
2918 parry_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2919 else
2920 parry_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2921
2922 if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_PARRY)))
2923 {
2924 tmp = parry_chance;
2925
2926 // xinef: cant parry while casting or while stunned
2927 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2928 tmp = 0;
2929
2930 if (tmp > 0 // check if unit _can_ parry
2931 && (tmp -= skillBonus) > 0
2932 && roll < (sum += tmp))
2933 {
2934 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: PARRY <{}, {})", sum - tmp, sum);
2935 return MELEE_HIT_PARRY;
2936 }
2937 }
2938
2939 if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_BLOCK)))
2940 {
2941 tmp = block_chance;
2942
2943 // xinef: cant block while casting or while stunned
2944 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2945 tmp = 0;
2946
2947 if (tmp > 0 // check if unit _can_ block
2948 && (tmp -= skillBonus) > 0
2949 && roll < (sum += tmp))
2950 {
2951 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: BLOCK <{}, {})", sum - tmp, sum);
2952 return MELEE_HIT_BLOCK;
2953 }
2954 }
2955 }
2956
2957 // Max 40% chance to score a glancing blow against mobs that are higher level (can do only players and pets and not with ranged weapon)
2958 if (attType != RANGED_ATTACK &&
2959 (IsPlayer() || IsPet()) &&
2960 !victim->IsPlayer() && !victim->IsPet() &&
2961 GetLevel() < victim->getLevelForTarget(this))
2962 {
2963 // cap possible value (with bonuses > max skill)
2964 int32 skill = attackerWeaponSkill;
2965 int32 maxskill = attackerMaxSkillValueForLevel;
2966 skill = (skill > maxskill) ? maxskill : skill;
2967
2968 tmp = (10 + (victimDefenseSkill - skill)) * 100;
2969 tmp = tmp > 4000 ? 4000 : tmp;
2970 if (roll < (sum += tmp))
2971 {
2972 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: GLANCING <{}, {})", sum - 4000, sum);
2973 return MELEE_HIT_GLANCING;
2974 }
2975 }
2976
2977 // mobs can score crushing blows if they're 4 or more levels above victim
2978 if (getLevelForTarget(victim) >= victim->getLevelForTarget(this) + 4 &&
2979 // can be from by creature (if can) or from controlled player that considered as creature
2982 {
2983 // when their weapon skill is 15 or more above victim's defense skill
2984 tmp = victimDefenseSkill;
2985 int32 tmpmax = victimMaxSkillValueForLevel;
2986 // having defense above your maximum (from items, talents etc.) has no effect
2987 tmp = tmp > tmpmax ? tmpmax : tmp;
2988 // tmp = mob's level * 5 - player's current defense skill
2989 tmp = attackerMaxSkillValueForLevel - tmp;
2990 if (tmp >= 15)
2991 {
2992 // add 2% chance per lacking skill point, min. is 15%
2993 tmp = tmp * 200 - 1500;
2994 if (roll < (sum += tmp))
2995 {
2996 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRUSHING <{}, {})", sum - tmp, sum);
2997 return MELEE_HIT_CRUSHING;
2998 }
2999 }
3000 }
3001
3002 // Critical chance
3003 tmp = crit_chance;
3004
3005 if (tmp > 0 && roll < (sum += tmp))
3006 {
3007 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT <{}, {})", sum - tmp, sum);
3008 if (IsCreature() && (ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_CRIT)))
3009 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT DISABLED)");
3010 else
3011 return MELEE_HIT_CRIT;
3012 }
3013
3014 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: NORMAL");
3015 return MELEE_HIT_NORMAL;
3016}
@ CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS
Definition: CreatureData.h:50
@ CREATURE_FLAG_EXTRA_NO_CRIT
Definition: CreatureData.h:62

References CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_CRIT, CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, GetDefenseSkillValue(), GetLevel(), getLevelForTarget(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetWeaponSkillValue(), Creature::HasFlagsExtra(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsNonMeleeSpellCast(), IsPet(), Object::IsPlayer(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, RANGED_ATTACK, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONTROLLED, urand(), and VICTIMSTATE_DODGE.

◆ Say() [1/2]

◆ Say() [2/2]

void Unit::Say ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21058{
21059 Talk(textId, CHAT_MSG_MONSTER_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
21060}

References CHAT_MSG_MONSTER_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ SelectNearbyNoTotemTarget()

Unit * Unit::SelectNearbyNoTotemTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17103{
17104 std::list<Unit*> targets;
17105 Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck u_check(this, this, dist);
17107 Cell::VisitObjects(this, searcher, dist);
17108
17109 // remove current target
17110 if (GetVictim())
17111 targets.remove(GetVictim());
17112
17113 if (exclude)
17114 targets.remove(exclude);
17115
17116 // remove not LoS targets
17117 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17118 {
17119 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17120 {
17121 std::list<Unit*>::iterator tIter2 = tIter;
17122 ++tIter;
17123 targets.erase(tIter2);
17124 }
17125 else
17126 ++tIter;
17127 }
17128
17129 // no appropriate targets
17130 if (targets.empty())
17131 return nullptr;
17132
17133 // select random
17135}
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition: Containers.h:133
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition: Unit.cpp:13972
Definition: GridNotifiers.h:414

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitObjects().

Referenced by spell_rog_blade_flurry::CheckProc(), and spell_warr_sweeping_strikes::CheckProc().

◆ SelectNearbyTarget()

Unit * Unit::SelectNearbyTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17068{
17069 std::list<Unit*> targets;
17070 Acore::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, dist);
17072 Cell::VisitObjects(this, searcher, dist);
17073
17074 // remove current target
17075 if (GetVictim())
17076 targets.remove(GetVictim());
17077
17078 if (exclude)
17079 targets.remove(exclude);
17080
17081 // remove not LoS targets
17082 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17083 {
17084 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17085 {
17086 std::list<Unit*>::iterator tIter2 = tIter;
17087 ++tIter;
17088 targets.erase(tIter2);
17089 }
17090 else
17091 ++tIter;
17092 }
17093
17094 // no appropriate targets
17095 if (targets.empty())
17096 return nullptr;
17097
17098 // select random
17100}
Definition: GridNotifiers.h:852

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitObjects().

Referenced by npc_pet_dk_army_of_the_dead::IsSummonedBy(), boss_yazzai::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_curator::JustSummoned(), npc_hodirs_fury::npc_hodirs_furyAI::UpdateAI(), npc_storm_beacon_spawn::npc_storm_beacon_spawnAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), Player::UpdateCharmedAI(), and boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI().

◆ SendAttackStateUpdate() [1/2]

void Unit::SendAttackStateUpdate ( CalcDamageInfo damageInfo)

Probably used for debugging purposes, as it is not known to appear on retail servers

6576{
6577 LOG_DEBUG("entities.unit", "WORLD: Sending SMSG_ATTACKERSTATEUPDATE");
6578
6579 uint32 tmpDamage[MAX_ITEM_PROTO_DAMAGES] = { };
6580 uint32 tmpAbsorb[MAX_ITEM_PROTO_DAMAGES] = { };
6581 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6582 {
6583 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6584 tmpDamage[i] = damageInfo->damages[i].damage;
6585 tmpAbsorb[i] = damageInfo->damages[i].absorb;
6586 if (damageInfo->target->IsPlayer() && damageInfo->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6587 {
6588 tmpAbsorb[i] = tmpDamage[i];
6589 tmpDamage[i] = 0;
6590 }
6591 }
6592
6593 uint32 count = 1;
6594 if (tmpDamage[1] || tmpAbsorb[1] || damageInfo->damages[1].resist)
6595 {
6596 ++count;
6597 }
6598
6599 std::size_t const maxsize = 4 + 5 + 5 + 4 + 4 + 1 + count * (4 + 4 + 4 + 4 + 4) + 1 + 4 + 4 + 4 + 4 + 4 * 12;
6600 WorldPacket data(SMSG_ATTACKERSTATEUPDATE, maxsize); // we guess size
6601 data << uint32(damageInfo->HitInfo);
6602 data << damageInfo->attacker->GetPackGUID();
6603 data << damageInfo->target->GetPackGUID();
6604 data << uint32(tmpDamage[0] + tmpDamage[1]); // Full damage
6605 int32 overkill = tmpDamage[0] + tmpDamage[1] - damageInfo->target->GetHealth();
6606 data << uint32(overkill < 0 ? 0 : overkill); // Overkill
6607 data << uint8(count); // Sub damage count
6608
6609 for (uint32 i = 0; i < count; ++i)
6610 {
6611 data << uint32(damageInfo->damages[i].damageSchoolMask); // School of sub damage
6612 data << float(tmpDamage[i]); // sub damage
6613 data << uint32(tmpDamage[i]); // Sub Damage
6614 }
6615
6617 {
6618 for (uint32 i = 0; i < count; ++i)
6619 {
6620 data << uint32(tmpAbsorb[i]); // Absorb
6621 }
6622 }
6623
6625 {
6626 for (uint32 i = 0; i < count; ++i)
6627 {
6628 data << uint32(damageInfo->damages[i].resist); // Resist
6629 }
6630 }
6631
6632 data << uint8(damageInfo->TargetState);
6633 data << uint32(0); // Unknown attackerstate
6634 data << uint32(0); // Melee spellid
6635
6636 if (damageInfo->HitInfo & HITINFO_BLOCK)
6637 data << uint32(damageInfo->blocked_amount);
6638
6639 if (damageInfo->HitInfo & HITINFO_RAGE_GAIN)
6640 data << uint32(0);
6641
6643 if (damageInfo->HitInfo & HITINFO_UNK1)
6644 {
6645 data << uint32(0);
6646 data << float(0);
6647 data << float(0);
6648 data << float(0);
6649 data << float(0);
6650 data << float(0);
6651 data << float(0);
6652 data << float(0);
6653 data << float(0);
6654 data << float(0); // Found in a loop with 1 iteration
6655 data << float(0); // ditto ^
6656 data << uint32(0);
6657 }
6658
6659 SendMessageToSet(&data, true);
6660}
@ HITINFO_RAGE_GAIN
Definition: Unit.h:121
@ HITINFO_UNK1
Definition: Unit.h:98
@ SMSG_ATTACKERSTATEUPDATE
Definition: Opcodes.h:360

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CHEAT_GOD, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), CalcDamageInfo::HitInfo, HITINFO_BLOCK, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_RAGE_GAIN, HITINFO_UNK1, Object::IsPlayer(), LOG_DEBUG, MAX_ITEM_PROTO_DAMAGES, CalcDamageInfo::resist, WorldObject::SendMessageToSet(), SMSG_ATTACKERSTATEUPDATE, CalcDamageInfo::target, CalcDamageInfo::TargetState, and Object::ToPlayer().

Referenced by AttackerStateUpdate(), misc_commandscript::HandleDamageCommand(), spell_dk_dancing_rune_weapon::HandleProc(), and SendAttackStateUpdate().

◆ SendAttackStateUpdate() [2/2]

void Unit::SendAttackStateUpdate ( uint32  HitInfo,
Unit target,
uint8  SwingType,
SpellSchoolMask  damageSchoolMask,
uint32  Damage,
uint32  AbsorbDamage,
uint32  Resist,
VictimState  TargetState,
uint32  BlockedAmount 
)
6663{
6664 CalcDamageInfo dmgInfo;
6665 dmgInfo.HitInfo = HitInfo;
6666 dmgInfo.attacker = this;
6667 dmgInfo.target = target;
6668
6669 dmgInfo.damages[0].damage = Damage - AbsorbDamage - Resist - BlockedAmount;
6670 dmgInfo.damages[0].damageSchoolMask = damageSchoolMask;
6671 dmgInfo.damages[0].absorb = AbsorbDamage;
6672 dmgInfo.damages[0].resist = Resist;
6673
6674 dmgInfo.damages[1].damage = 0;
6675 dmgInfo.damages[1].damageSchoolMask = 0;
6676 dmgInfo.damages[1].absorb = 0;
6677 dmgInfo.damages[1].resist = 0;
6678
6679 dmgInfo.TargetState = TargetState;
6680 dmgInfo.blocked_amount = BlockedAmount;
6681 SendAttackStateUpdate(&dmgInfo);
6682}
HitInfo
Definition: Unit.h:96

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, CalcDamageInfo::HitInfo, CalcDamageInfo::resist, SendAttackStateUpdate(), CalcDamageInfo::target, and CalcDamageInfo::TargetState.

◆ SendChangeCurrentVictimOpcode()

void Unit::SendChangeCurrentVictimOpcode ( HostileReference pHostileReference)
19929{
19930 if (!GetThreatMgr().isThreatListEmpty())
19931 {
19932 uint32 count = GetThreatMgr().GetThreatList().size();
19933
19934 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_HIGHEST_THREAT_UPDATE Message");
19935 WorldPacket data(SMSG_HIGHEST_THREAT_UPDATE, 8 + 8 + count * 8);
19936 data << GetPackGUID();
19937 data << pHostileReference->getUnitGuid().WriteAsPacked();
19938 data << uint32(count);
19940 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
19941 {
19942 data << (*itr)->getUnitGuid().WriteAsPacked();
19943 data << uint32((*itr)->GetThreat() * 100);
19944 }
19945 SendMessageToSet(&data, false);
19946 }
19947}
@ SMSG_HIGHEST_THREAT_UPDATE
Definition: Opcodes.h:1184
std::list< HostileReference * > StorageType
Definition: ThreatMgr.h:147
PackedGuid WriteAsPacked() const
Definition: ObjectGuid.h:316

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_HIGHEST_THREAT_UPDATE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::setCurrentVictim().

◆ SendClearTarget()

void Unit::SendClearTarget ( )
20175{
20177 data << GetPackGUID();
20178 SendMessageToSet(&data, false);
20179}
@ SMSG_BREAK_TARGET
Definition: Opcodes.h:368

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_BREAK_TARGET.

Referenced by Vehicle::AddPassenger(), and Spell::EffectForceDeselect().

◆ SendClearThreatListOpcode()

void Unit::SendClearThreatListOpcode ( )
19950{
19951 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_CLEAR Message");
19953 data << GetPackGUID();
19954 SendMessageToSet(&data, false);
19955}
@ SMSG_THREAT_CLEAR
Definition: Opcodes.h:1187

References Object::GetPackGUID(), LOG_DEBUG, WorldObject::SendMessageToSet(), and SMSG_THREAT_CLEAR.

Referenced by ThreatMgr::ClearAllThreat().

◆ SendComboPoints()

void Unit::SendComboPoints ( )
16965{
16966 if (m_cleanupDone)
16967 {
16968 return;
16969 }
16970
16972 if (Player* playerMe = ToPlayer())
16973 {
16974 WorldPacket data(SMSG_UPDATE_COMBO_POINTS, packGUID.size() + 1);
16975 data << packGUID;
16976 data << uint8(m_comboPoints);
16977 playerMe->SendDirectMessage(&data);
16978 }
16979
16980 ObjectGuid ownerGuid = GetCharmerOrOwnerGUID();
16981 Player* owner = nullptr;
16982 if (ownerGuid.IsPlayer())
16983 {
16984 owner = ObjectAccessor::GetPlayer(*this, ownerGuid);
16985 }
16986
16987 if (m_movedByPlayer || owner)
16988 {
16989 WorldPacket data(SMSG_PET_UPDATE_COMBO_POINTS, GetPackGUID().size() + packGUID.size() + 1);
16990 data << GetPackGUID();
16991 data << packGUID;
16992 data << uint8(m_comboPoints);
16993
16994 if (m_movedByPlayer)
16996
16997 if (owner && owner != m_movedByPlayer)
16998 owner->SendDirectMessage(&data);
16999 }
17000}
@ SMSG_PET_UPDATE_COMBO_POINTS
Definition: Opcodes.h:1200
@ SMSG_UPDATE_COMBO_POINTS
Definition: Opcodes.h:955
Definition: ObjectGuid.h:263
std::size_t size() const
Definition: ObjectGuid.h:274

References GetCharmerOrOwnerGUID(), Object::GetPackGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), m_cleanupDone, m_comboPoints, m_comboTarget, m_movedByPlayer, Player::SendDirectMessage(), PackedGuid::size(), SMSG_PET_UPDATE_COMBO_POINTS, SMSG_UPDATE_COMBO_POINTS, and Object::ToPlayer().

Referenced by AddComboPoints(), and ClearComboPoints().

◆ SendEnergizeSpellLog()

void Unit::SendEnergizeSpellLog ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11353{
11354 WorldPacket data(SMSG_SPELLENERGIZELOG, (8 + 8 + 4 + 4 + 4 + 1));
11355 data << victim->GetPackGUID();
11356 data << GetPackGUID();
11357 data << uint32(spellID);
11358 data << uint32(powerType);
11359 data << uint32(damage);
11360 SendMessageToSet(&data, true);
11361}
@ SMSG_SPELLENERGIZELOG
Definition: Opcodes.h:367

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLENERGIZELOG.

Referenced by EnergizeBySpell(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ SendHealSpellLog()

void Unit::SendHealSpellLog ( HealInfo const &  healInfo,
bool  critical = false 
)
11320{
11321 uint32 overheal = healInfo.GetHeal() - healInfo.GetEffectiveHeal();
11322
11323 // we guess size
11324 WorldPacket data(SMSG_SPELLHEALLOG, (8 + 8 + 4 + 4 + 4 + 4 + 1 + 1));
11325 data << healInfo.GetTarget()->GetPackGUID();
11326 data << GetPackGUID();
11327 data << uint32(healInfo.GetSpellInfo()->Id);
11328 data << uint32(healInfo.GetHeal());
11329 data << uint32(overheal);
11330 data << uint32(healInfo.GetAbsorb()); // Absorb amount
11331 data << uint8(critical ? 1 : 0);
11332 data << uint8(0); // unused
11333 SendMessageToSet(&data, true);
11334}
@ SMSG_SPELLHEALLOG
Definition: Opcodes.h:366

References HealInfo::GetAbsorb(), HealInfo::GetEffectiveHeal(), HealInfo::GetHeal(), Object::GetPackGUID(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SpellInfo::Id, WorldObject::SendMessageToSet(), and SMSG_SPELLHEALLOG.

Referenced by HealBySpell().

◆ SendMeleeAttackStart()

void Unit::SendMeleeAttackStart ( Unit victim,
Player sendTo = nullptr 
)
3096{
3097 WorldPacket data(SMSG_ATTACKSTART, 8 + 8);
3098 data << GetGUID();
3099 data << victim->GetGUID();
3100 if (sendTo)
3101 sendTo->SendDirectMessage(&data);
3102 else
3103 SendMessageToSet(&data, true);
3104 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTART");
3105}
@ SMSG_ATTACKSTART
Definition: Opcodes.h:353

References Object::GetGUID(), LOG_DEBUG, Player::SendDirectMessage(), WorldObject::SendMessageToSet(), and SMSG_ATTACKSTART.

Referenced by Attack(), Player::GetInitialVisiblePackets(), and boss_leotheras_the_blind::Reset().

◆ SendMeleeAttackStop()

void Unit::SendMeleeAttackStop ( Unit victim = nullptr)

Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.

3112{
3113 // pussywizard: calling SendMeleeAttackStop without clearing UNIT_STATE_MELEE_ATTACKING and then AttackStart the same player may spoil npc rotating!
3114 // pussywizard: this happens in some boss scripts, just add clearing here
3115 // ClearUnitState(UNIT_STATE_MELEE_ATTACKING); // commented out for now
3116
3117 WorldPacket data(SMSG_ATTACKSTOP, (8 + 8 + 4));
3118 data << GetPackGUID();
3119
3120 if (victim)
3121 {
3122 data << victim->GetPackGUID();
3123 data << (uint32)victim->isDead();
3124 }
3125 SendMessageToSet(&data, true);
3126 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTOP");
3127
3128 if (victim)
3129 LOG_DEBUG("entities.unit", "{} {} stopped attacking {} {}", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString(), (victim->IsPlayer() ? "player" : "creature"), victim->GetGUID().ToString());
3130 else
3131 LOG_DEBUG("entities.unit", "{} {} stopped attacking", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString());
3132}
@ SMSG_ATTACKSTOP
Definition: Opcodes.h:354
bool isDead() const
Definition: Unit.h:1712

References Object::GetGUID(), Object::GetPackGUID(), isDead(), Object::IsPlayer(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_ATTACKSTOP, ObjectGuid::ToString(), and Position::ToString().

Referenced by Attack(), AttackStop(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_svalna_revive_champion::Land(), boss_leotheras_the_blind::Reset(), SetControlled(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), and boss_razorscale::boss_razorscaleAI::UpdateAI().

◆ SendMonsterMove()

void Unit::SendMonsterMove ( float  NewPosX,
float  NewPosY,
float  NewPosZ,
uint32  TransitTime,
SplineFlags  sf = SPLINEFLAG_WALK_MODE 
)
540{
541 WorldPacket data(SMSG_MONSTER_MOVE, 1 + 12 + 4 + 1 + 4 + 4 + 4 + 12 + GetPackGUID().size());
542 data << GetPackGUID();
543
544 data << uint8(0); // new in 3.1
545 data << GetPositionX() << GetPositionY() << GetPositionZ();
546 data << GameTime::GetGameTimeMS().count();
547 data << uint8(0);
548 data << uint32(sf);
549 data << TransitTime; // Time in between points
550 data << uint32(1); // 1 single waypoint
551 data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
552
553 SendMessageToSet(&data, true);
554}
@ SMSG_MONSTER_MOVE
Definition: Opcodes.h:251

References GameTime::GetGameTimeMS(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::SendMessageToSet(), and SMSG_MONSTER_MOVE.

Referenced by npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI().

◆ SendMovementFeatherFall()

void Unit::SendMovementFeatherFall ( Player sendTo)
20525{
20526 if (!movespline->Initialized())
20527 return;
20529 data << GetPackGUID();
20530 sendTo->SendDirectMessage(&data);
20531}
@ SMSG_SPLINE_MOVE_FEATHER_FALL
Definition: Opcodes.h:803

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_FEATHER_FALL.

Referenced by Player::GetAurasForTarget().

◆ SendMovementFlagUpdate()

void Unit::SendMovementFlagUpdate ( bool  self = false)
16788{
16789 WorldPacket data;
16790 BuildHeartBeatMsg(&data);
16791 SendMessageToSet(&data, self);
16792}
void BuildHeartBeatMsg(WorldPacket *data) const
Definition: Object.cpp:2058

References BuildHeartBeatMsg(), and WorldObject::SendMessageToSet().

Referenced by boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_madrigosa::DoAction(), boss_nightbane::EnterEvadeMode(), boss_kaelthas::ExecuteMiddleEvent(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), boss_felmyst::InitializeAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_harbinger_skyriss::JustSummoned(), MotionMaster::MoveFall(), npc_twilight_volunteer::MovementInform(), boss_felmyst::MovementInform(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_dancing_flames::npc_dancing_flamesAI::Reset(), boss_felmyst::ScheduleGroundAbilities(), SetCharm(), SetHover(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_felmyst::StartIntro(), boss_nightbane::TriggerHealthTakeOff(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), Player::UpdateCharmedAI(), and brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI().

◆ SendMovementHover()

void Unit::SendMovementHover ( Player sendTo)
20562{
20563 if (!movespline->Initialized())
20564 return;
20566 data << GetPackGUID();
20567 sendTo->SendDirectMessage(&data);
20568}
@ SMSG_SPLINE_MOVE_SET_HOVER
Definition: Opcodes.h:805

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_SET_HOVER.

Referenced by Player::GetAurasForTarget().

◆ SendMovementWaterWalking()

void Unit::SendMovementWaterWalking ( Player sendTo)
20503{
20504 if (!movespline->Initialized())
20505 return;
20507 data << GetPackGUID();
20508 sendTo->SendDirectMessage(&data);
20509}
@ SMSG_SPLINE_MOVE_WATER_WALK
Definition: Opcodes.h:807

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_WATER_WALK.

Referenced by Player::GetAurasForTarget().

◆ SendPeriodicAuraLog()

void Unit::SendPeriodicAuraLog ( SpellPeriodicAuraLogInfo pInfo)
6486{
6487 AuraEffect const* aura = pInfo->auraEff;
6489 data << GetPackGUID();
6490 data << aura->GetCasterGUID().WriteAsPacked();
6491 data << uint32(aura->GetId()); // spellId
6492 data << uint32(1); // count
6493 data << uint32(aura->GetAuraType()); // auraId
6494 switch (aura->GetAuraType())
6495 {
6498 {
6499 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6500 uint32 damage = pInfo->damage;
6501 uint32 absorb = pInfo->absorb;
6502 if (IsPlayer() && ToPlayer()->GetCommandStatus(CHEAT_GOD))
6503 {
6504 absorb = damage;
6505 damage = 0;
6506 }
6507
6508 data << uint32(damage); // damage
6509 data << uint32(pInfo->overDamage); // overkill?
6510 data << uint32(aura->GetSpellInfo()->GetSchoolMask());
6511 data << uint32(absorb); // absorb
6512 data << uint32(pInfo->resist); // resist
6513 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6514 }
6515 break;
6518 data << uint32(pInfo->damage); // damage
6519 data << uint32(pInfo->overDamage); // overheal
6520 data << uint32(pInfo->absorb); // absorb
6521 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6522 break;
6525 data << uint32(aura->GetMiscValue()); // power type
6526 data << uint32(pInfo->damage); // damage
6527 break;
6529 data << uint32(aura->GetMiscValue()); // power type
6530 data << uint32(pInfo->damage); // amount
6531 data << float(pInfo->multiplier); // gain multiplier
6532 break;
6533 default:
6534 LOG_ERROR("entities.unit", "Unit::SendPeriodicAuraLog: unknown aura {}", uint32(aura->GetAuraType()));
6535 return;
6536 }
6537
6538 SendMessageToSet(&data, true);
6539}
@ SPELL_AURA_OBS_MOD_HEALTH
Definition: SpellAuraDefines.h:83
@ SPELL_AURA_PERIODIC_MANA_LEECH
Definition: SpellAuraDefines.h:127
@ SPELL_AURA_PERIODIC_ENERGIZE
Definition: SpellAuraDefines.h:87
@ SMSG_PERIODICAURALOG
Definition: Opcodes.h:620
float multiplier
Definition: Unit.h:522
bool critical
Definition: Unit.h:523
uint32 overDamage
Definition: Unit.h:519
uint32 resist
Definition: Unit.h:521
uint32 damage
Definition: Unit.h:518
AuraEffect const * auraEff
Definition: Unit.h:517
uint32 absorb
Definition: Unit.h:520

References SpellPeriodicAuraLogInfo::absorb, SpellPeriodicAuraLogInfo::auraEff, CHEAT_GOD, SpellPeriodicAuraLogInfo::critical, SpellPeriodicAuraLogInfo::damage, AuraEffect::GetAuraType(), AuraEffect::GetCasterGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), Object::GetPackGUID(), SpellInfo::GetSchoolMask(), AuraEffect::GetSpellInfo(), Object::IsPlayer(), LOG_ERROR, SpellPeriodicAuraLogInfo::multiplier, SpellPeriodicAuraLogInfo::overDamage, SpellPeriodicAuraLogInfo::resist, WorldObject::SendMessageToSet(), SMSG_PERIODICAURALOG, SPELL_AURA_OBS_MOD_HEALTH, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_ENERGIZE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_MANA_LEECH, Object::ToPlayer(), and ObjectGuid::WriteAsPacked().

Referenced by AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SendPetActionFeedback()

void Unit::SendPetActionFeedback ( uint8  msg)

-------—Pet responses methods--------------—

16692{
16693 Unit* owner = GetOwner();
16694 if (!owner || !owner->IsPlayer())
16695 return;
16696
16698 data << uint8(msg);
16699 owner->ToPlayer()->GetSession()->SendPacket(&data);
16700}
@ SMSG_PET_ACTION_FEEDBACK
Definition: Opcodes.h:740

References GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_PET_ACTION_FEEDBACK, and Object::ToPlayer().

Referenced by WorldSession::HandlePetCancelAuraOpcode().

◆ SendPetAIReaction()

void Unit::SendPetAIReaction ( ObjectGuid  guid)
16715{
16716 Unit* owner = GetOwner();
16717 if (!owner || !owner->IsPlayer())
16718 return;
16719
16720 WorldPacket data(SMSG_AI_REACTION, 8 + 4);
16721 data << guid;
16722 data << uint32(AI_REACTION_HOSTILE);
16723 owner->ToPlayer()->GetSession()->SendPacket(&data);
16724}
@ SMSG_AI_REACTION
Definition: Opcodes.h:346

References AI_REACTION_HOSTILE, GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_AI_REACTION, and Object::ToPlayer().

Referenced by PetAI::DoAttack(), and WorldSession::HandlePetActionHelper().

◆ SendPetTalk()

void Unit::SendPetTalk ( uint32  pettalk)
16703{
16704 Unit* owner = GetOwner();
16705 if (!owner || !owner->IsPlayer())
16706 return;
16707
16709 data << GetGUID();
16710 data << uint32(pettalk);
16711 owner->ToPlayer()->GetSession()->SendPacket(&data);
16712}
@ SMSG_PET_ACTION_SOUND
Definition: Opcodes.h:834

References Object::GetGUID(), GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_PET_ACTION_SOUND, and Object::ToPlayer().

Referenced by WorldSession::HandlePetActionHelper().

◆ SendPlaySpellImpact()

void Unit::SendPlaySpellImpact ( ObjectGuid  guid,
uint32  id 
)
19017{
19019 data << guid; // target
19020 data << uint32(id); // SpellVisualKit.dbc index
19021 SendMessageToSet(&data, true);
19022}
@ SMSG_PLAY_SPELL_IMPACT
Definition: Opcodes.h:533

References WorldObject::SendMessageToSet(), and SMSG_PLAY_SPELL_IMPACT.

Referenced by debug_commandscript::HandleDebugVisualCommand(), and WorldSession::HandleTrainerBuySpellOpcode().

◆ SendPlaySpellVisual()

void Unit::SendPlaySpellVisual ( uint32  id)

◆ SendRemoveFromThreatListOpcode()

void Unit::SendRemoveFromThreatListOpcode ( HostileReference pHostileReference)
19958{
19959 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_REMOVE Message");
19960 WorldPacket data(SMSG_THREAT_REMOVE, 8 + 8);
19961 data << GetPackGUID();
19962 data << pHostileReference->getUnitGuid().WriteAsPacked();
19963 SendMessageToSet(&data, false);
19964}
@ SMSG_THREAT_REMOVE
Definition: Opcodes.h:1186

References Object::GetPackGUID(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_THREAT_REMOVE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::processThreatEvent().

◆ SendSpellDamageImmune()

void Unit::SendSpellDamageImmune ( Unit target,
uint32  spellId 
)
6566{
6567 WorldPacket data(SMSG_SPELLORDAMAGE_IMMUNE, 8 + 8 + 4 + 1);
6568 data << GetGUID();
6569 data << target->GetGUID();
6570 data << uint32(spellId);
6571 data << uint8(0); // bool - log format: 0-default, 1-debug
6572 SendMessageToSet(&data, true);
6573}
@ SMSG_SPELLORDAMAGE_IMMUNE
Definition: Opcodes.h:641

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLORDAMAGE_IMMUNE.

Referenced by DealMeleeDamage(), Spell::EffectEnergize(), Spell::EffectHealMaxHealth(), and AuraEffect::SendTickImmune().

◆ SendSpellDamageResist()

void Unit::SendSpellDamageResist ( Unit target,
uint32  spellId 
)
6556{
6557 WorldPacket data(SMSG_PROCRESIST, 8 + 8 + 4 + 1);
6558 data << GetGUID();
6559 data << target->GetGUID();
6560 data << uint32(spellId);
6561 data << uint8(0); // bool - log format: 0-default, 1-debug
6562 SendMessageToSet(&data, true);
6563}
@ SMSG_PROCRESIST
Definition: Opcodes.h:638

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_PROCRESIST.

◆ SendSpellMiss()

void Unit::SendSpellMiss ( Unit target,
uint32  spellID,
SpellMissInfo  missInfo 
)
6542{
6543 WorldPacket data(SMSG_SPELLLOGMISS, (4 + 8 + 1 + 4 + 8 + 1));
6544 data << uint32(spellID);
6545 data << GetGUID();
6546 data << uint8(0); // can be 0 or 1
6547 data << uint32(1); // target count
6548 // for (i = 0; i < target count; ++i)
6549 data << target->GetGUID(); // target GUID
6550 data << uint8(missInfo);
6551 // end loop
6552 SendMessageToSet(&data, true);
6553}
@ SMSG_SPELLLOGMISS
Definition: Opcodes.h:617

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLLOGMISS.

Referenced by DealMeleeDamage(), and Spell::DoAllEffectOnTarget().

◆ SendSpellNonMeleeDamageLog() [1/2]

void Unit::SendSpellNonMeleeDamageLog ( SpellNonMeleeDamage log)
6407{
6408 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6409 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6410 uint32 damage = log->damage;
6411 uint32 absorb = log->absorb;
6412 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6413 {
6414 absorb = damage;
6415 damage = 0;
6416 }
6417 data << log->target->GetPackGUID();
6418 data << log->attacker->GetPackGUID();
6419 data << uint32(log->spellInfo->Id);
6420 data << uint32(damage); // damage amount
6421 int32 overkill = damage - log->target->GetHealth();
6422 data << uint32(overkill > 0 ? overkill : 0); // overkill
6423 data << uint8 (log->schoolMask); // damage school
6424 data << uint32(absorb); // AbsorbedDamage
6425 data << uint32(log->resist); // resist
6426 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6427 data << uint8 (log->unused); // unused
6428 data << uint32(log->blocked); // blocked
6429 data << uint32(log->HitInfo);
6430 data << uint32(log->HitInfo);
6432 //if (log->HitInfo & SPELL_HIT_TYPE_CRIT_DEBUG)
6433 //{
6434 // data << float(log->CritRoll);
6435 // data << float(log->CritNeeded);
6436 //}
6437 //if (log->HitInfo & SPELL_HIT_TYPE_HIT_DEBUG)
6438 //{
6439 // data << float(log->HitRoll);
6440 // data << float(log->HitNeeded);
6441 //}
6442 //if (log->HitInfo & SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG)
6443 //{
6444 // data << float(log->MissChance);
6445 // data << float(log->DodgeChance);
6446 // data << float(log->ParryChance);
6447 // data << float(log->BlockChance);
6448 // data << float(log->GlanceChance);
6449 // data << float(log->CrushChance);
6450 //}
6451 SendMessageToSet(&data, true);
6452}
@ SPELL_HIT_TYPE_HIT_DEBUG
Definition: SharedDefines.h:1548
@ SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG
Definition: SharedDefines.h:1551
@ SPELL_HIT_TYPE_CRIT_DEBUG
Definition: SharedDefines.h:1546
@ SMSG_SPELLNONMELEEDAMAGELOG
Definition: Opcodes.h:622
bool physicalLog
Definition: Unit.h:504
bool unused
Definition: Unit.h:505

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, WorldObject::SendMessageToSet(), SMSG_SPELLNONMELEEDAMAGELOG, SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG, SPELL_HIT_TYPE_CRIT_DEBUG, SPELL_HIT_TYPE_HIT_DEBUG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by CalcAbsorbResist(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectEnvironmentalDMG(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and SendSpellNonMeleeDamageLog().

◆ SendSpellNonMeleeDamageLog() [2/2]

void Unit::SendSpellNonMeleeDamageLog ( Unit target,
SpellInfo const *  spellInfo,
uint32  Damage,
SpellSchoolMask  damageSchoolMask,
uint32  AbsorbedDamage,
uint32  Resist,
bool  PhysicalDamage,
uint32  Blocked,
bool  CriticalHit = false,
bool  Split = false 
)
6455{
6456 SpellNonMeleeDamage log(this, target, spellInfo, damageSchoolMask);
6457 log.damage = Damage;
6458 log.absorb = AbsorbedDamage;
6459 log.resist = Resist;
6460 log.physicalLog = PhysicalDamage;
6461 log.blocked = Blocked;
6462 log.HitInfo = 0;
6463 if (CriticalHit)
6464 {
6465 log.HitInfo |= SPELL_HIT_TYPE_CRIT;
6466 }
6467 if (Split)
6468 {
6469 log.HitInfo |= SPELL_HIT_TYPE_SPLIT;
6470 }
6472}
@ SPELL_HIT_TYPE_SPLIT
Definition: SharedDefines.h:1549
Definition: Unit.h:490

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, SpellNonMeleeDamage::damage, SpellNonMeleeDamage::HitInfo, SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SendSpellNonMeleeDamageLog(), SPELL_HIT_TYPE_CRIT, and SPELL_HIT_TYPE_SPLIT.

◆ SendSpellNonMeleeReflectLog()

void Unit::SendSpellNonMeleeReflectLog ( SpellNonMeleeDamage log,
Unit attacker 
)
6375{
6376 // Xinef: function for players only, placed in unit because of cosmetics
6377 if (!IsPlayer())
6378 return;
6379
6380 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6381 // If we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our HP bar will not drop
6382 uint32 damage = log->damage;
6383 uint32 absorb = log->absorb;
6384 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6385 {
6386 absorb = damage;
6387 damage = 0;
6388 }
6389 data << log->target->GetPackGUID();
6390 data << attacker->GetPackGUID();
6391 data << uint32(log->spellInfo->Id);
6392 data << uint32(damage); // damage amount
6393 int32 overkill = damage - log->target->GetHealth();
6394 data << uint32(overkill > 0 ? overkill : 0); // overkill
6395 data << uint8 (log->schoolMask); // damage school
6396 data << uint32(absorb); // AbsorbedDamage
6397 data << uint32(log->resist); // resist
6398 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6399 data << uint8 (log->unused); // unused
6400 data << uint32(log->blocked); // blocked
6401 data << uint32(log->HitInfo);
6402 data << uint8 (0); // flag to use extend data
6403 ToPlayer()->SendDirectMessage(&data);
6404}

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, Player::SendDirectMessage(), SMSG_SPELLNONMELEEDAMAGELOG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by Spell::DoAllEffectOnTarget().

◆ SendTameFailure()

void Unit::SendTameFailure ( uint8  result)
19830{
19832 data << uint8(result);
19833 ToPlayer()->SendDirectMessage(&data);
19834}
@ SMSG_PET_TAME_FAILURE
Definition: Opcodes.h:401

References Player::SendDirectMessage(), SMSG_PET_TAME_FAILURE, and Object::ToPlayer().

Referenced by spell_hun_tame_beast::CheckCast(), and Spell::CheckCast().

◆ SendTeleportPacket()

void Unit::SendTeleportPacket ( Position pos)
19837{
19839 if (IsCreature())
19840 Relocate(&pos);
19841 if (IsPlayer())
19842 {
19843 ToPlayer()->SetCanTeleport(true);
19844 }
19845 WorldPacket data2(MSG_MOVE_TELEPORT, 38);
19846 data2 << GetPackGUID();
19847 BuildMovementPacket(&data2);
19848 if (IsCreature())
19849 Relocate(&oldPos);
19850 if (IsPlayer())
19851 Relocate(&pos);
19852 SendMessageToSet(&data2, false);
19853}
@ MSG_MOVE_TELEPORT
Definition: Opcodes.h:227

References BuildMovementPacket(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsCreature(), Object::IsPlayer(), MSG_MOVE_TELEPORT, Position::Relocate(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), and Object::ToPlayer().

Referenced by NearTeleportTo(), and Player::TeleportTo().

◆ SendThreatListUpdate()

void Unit::SendThreatListUpdate ( )
19909{
19910 if (!GetThreatMgr().isThreatListEmpty())
19911 {
19912 uint32 count = GetThreatMgr().GetThreatList().size();
19913
19914 //LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_UPDATE Message");
19915 WorldPacket data(SMSG_THREAT_UPDATE, 8 + count * 8);
19916 data << GetPackGUID();
19917 data << uint32(count);
19919 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
19920 {
19921 data << (*itr)->getUnitGuid().WriteAsPacked();
19922 data << uint32((*itr)->GetThreat() * 100);
19923 }
19924 SendMessageToSet(&data, false);
19925 }
19926}
@ SMSG_THREAT_UPDATE
Definition: Opcodes.h:1185

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::SendMessageToSet(), and SMSG_THREAT_UPDATE.

Referenced by Update().

◆ SetAI()

void Unit::SetAI ( UnitAI newAI)
inline
649{ i_AI = newAI; }

References i_AI.

◆ SetArmor()

void Unit::SetArmor ( int32  val)
inline

◆ SetAttackTime()

◆ setAttackTimer()

◆ SetAuraStack()

void Unit::SetAuraStack ( uint32  spellId,
Unit target,
uint32  stack 
)
19000{
19001 Aura* aura = target->GetAura(spellId, GetGUID());
19002 if (!aura)
19003 aura = AddAura(spellId, target);
19004 if (aura && stack)
19005 aura->SetStackAmount(stack);
19006}
void SetStackAmount(uint8 num)
Definition: SpellAuras.cpp:995

References AddAura(), GetAura(), Object::GetGUID(), and Aura::SetStackAmount().

Referenced by boss_viscidus::DamageTaken(), spell_capacitus_polarity_charge::HandleTargets(), spell_thaddius_pos_neg_charge::HandleTargets(), and BattlefieldWG::OnPlayerJoinWar().

◆ SetBaseWeaponDamage()

void Unit::SetBaseWeaponDamage ( WeaponAttackType  attType,
WeaponDamageRange  damageRange,
float  value,
uint8  damageIndex = 0 
)
inline
1141{ m_weaponDamage[attType][damageRange][damageIndex] = value; }

References m_weaponDamage.

Referenced by Player::_ApplyWeaponDamage(), Guardian::InitStatsForLevel(), and Creature::SelectLevel().

◆ SetCanDualWield()

virtual void Unit::SetCanDualWield ( bool  value)
inlinevirtual

◆ SetCanFly()

bool Unit::SetCanFly ( bool  enable,
bool  packetOnly = false 
)
virtual

Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().

Doesn't inform the client.

Reimplemented in Player, and Creature.

20468{
20470 return false;
20471
20472 if (enable)
20473 {
20476 }
20477 else
20478 {
20480 }
20481
20482 return true;
20483}
@ MOVEMENTFLAG_CAN_FLY
Definition: UnitDefines.h:391
@ MOVEMENTFLAG_MASK_MOVING_FLY
Definition: UnitDefines.h:408
void AddUnitMovementFlag(uint32 f)
Definition: Unit.h:727

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_CAN_FLY, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_MASK_MOVING_FLY, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_chapter5_light_of_dawn_aura::OnApply(), spell_chapter5_light_of_dawn_aura::OnRemove(), Player::SetCanFly(), and Creature::SetCanFly().

◆ SetCanModifyStats()

◆ SetCantProc()

void Unit::SetCantProc ( bool  apply)
17370{
17371 if (apply)
17372 ++m_procDeep;
17373 else
17374 {
17376 --m_procDeep;
17377 }
17378}

References ASSERT, and m_procDeep.

Referenced by HandleDummyAuraProc(), and ProcDamageAndSpellFor().

◆ SetCharm()

void Unit::SetCharm ( Unit target,
bool  apply 
)
Todo:
: maybe we can use this flag to check if controlled by player
10972{
10973 if (apply)
10974 {
10975 if (IsPlayer())
10976 {
10977 if (!AddGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
10978 LOG_FATAL("entities.unit", "Player {} is trying to charm unit {}, but it already has a charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
10979
10980 charm->m_ControlledByPlayer = true;
10982 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10983 }
10984 else
10985 charm->m_ControlledByPlayer = false;
10986
10987 // PvP, FFAPvP
10988 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, GetByteValue(UNIT_FIELD_BYTES_2, 1));
10989
10990 if (!charm->AddGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
10991 LOG_FATAL("entities.unit", "Unit {} is being charmed, but it already has a charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
10992
10993 _isWalkingBeforeCharm = charm->IsWalking();
10995 {
10996 charm->SetWalk(false);
10997 charm->SendMovementFlagUpdate();
10998 }
10999
11000 m_Controlled.insert(charm);
11001 }
11002 else
11003 {
11004 if (IsPlayer())
11005 {
11006 if (!RemoveGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
11007 LOG_FATAL("entities.unit", "Player {} is trying to uncharm unit {}, but it has another charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
11008 }
11009
11010 if (!charm->RemoveGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
11011 LOG_FATAL("entities.unit", "Unit {} is being uncharmed, but it has another charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
11012
11013 if (charm->IsPlayer())
11014 {
11015 charm->m_ControlledByPlayer = true;
11016 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11017 charm->ToPlayer()->UpdatePvPState();
11018 }
11019 else if (Player* player = charm->GetCharmerOrOwnerPlayerOrPlayerItself())
11020 {
11021 charm->m_ControlledByPlayer = true;
11022 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11023 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, player->GetByteValue(UNIT_FIELD_BYTES_2, 1));
11024
11025 // Xinef: skip controlled erase if charmed unit is owned by charmer
11026 if (charm->IsInWorld() && !charm->IsDuringRemoveFromWorld() && player->GetGUID() == this->GetGUID() && (charm->IsPet() || charm->HasUnitTypeMask(UNIT_MASK_MINION)))
11027 return;
11028 }
11029 else
11030 {
11031 charm->m_ControlledByPlayer = false;
11032 charm->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11033 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0);
11034 }
11035
11036 if (charm->IsWalking() != _isWalkingBeforeCharm)
11037 {
11038 charm->SetWalk(_isWalkingBeforeCharm);
11039 charm->SendMovementFlagUpdate(true); // send packet to self, to update movement state on player.
11040 }
11041
11042 m_Controlled.erase(charm);
11043 }
11044}
bool AddGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:675
bool RemoveGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:693

References _isWalkingBeforeCharm, Object::AddGuidValue(), Object::GetByteValue(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), WorldObject::GetName(), HasUnitTypeMask(), IsDuringRemoveFromWorld(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), IsWalking(), LOG_FATAL, m_Controlled, m_ControlledByPlayer, Object::RemoveGuidValue(), RemoveUnitFlag(), SendMovementFlagUpdate(), Object::SetByteValue(), SetUnitFlag(), SetWalk(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), UNIT_FIELD_BYTES_2, UNIT_FIELD_CHARM, UNIT_FIELD_CHARMEDBY, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_MASK_MINION, and Player::UpdatePvPState().

Referenced by RemoveCharmedBy(), SetCharmedBy(), and Player::StopCastingCharm().

◆ SetCharmedBy()

bool Unit::SetCharmedBy ( Unit charmer,
CharmType  type,
AuraApplication const *  aurApp = nullptr 
)
18448{
18449 if (!charmer)
18450 return false;
18451
18452 if (!charmer->IsInWorld() || charmer->IsDuringRemoveFromWorld())
18453 {
18454 return false;
18455 }
18456
18457 // dismount players when charmed
18458 if (IsPlayer())
18460
18461 if (charmer->IsPlayer())
18463
18464 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18465 if (type == CHARM_TYPE_VEHICLE && !IsVehicle()) // pussywizard
18466 throw 1;
18467 ASSERT((type == CHARM_TYPE_VEHICLE) == IsVehicle());
18468
18469 LOG_DEBUG("entities.unit", "SetCharmedBy: charmer {} ({}), charmed {} ({}), type {}.",
18470 charmer->GetEntry(), charmer->GetGUID().ToString(), GetEntry(), GetGUID().ToString(), uint32(type));
18471
18472 if (this == charmer)
18473 {
18474 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Unit {} ({}) is trying to charm itself!", GetEntry(), GetGUID().ToString());
18475 return false;
18476 }
18477
18478 //if (HasUnitState(UNIT_STATE_UNATTACKABLE))
18479 // return false;
18480
18481 if (IsPlayer() && ToPlayer()->GetTransport())
18482 {
18483 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Player on transport is trying to charm {} ({})", GetEntry(), GetGUID().ToString());
18484 return false;
18485 }
18486
18487 // Already charmed
18488 if (GetCharmerGUID())
18489 {
18490 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) has already been charmed but {} ({}) is trying to charm it!",
18491 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18492 return false;
18493 }
18494
18495 CastStop();
18496 AttackStop();
18497
18498 // Xinef: dont reset threat and combat, put them on offline list, moved down after faction changes
18499 // CombatStop(); /// @todo: CombatStop(true) may cause crash (interrupt spells)
18500 // DeleteThreatList();
18501
18502 Player* playerCharmer = charmer->ToPlayer();
18503
18504 // Charmer stop charming
18505 if (playerCharmer)
18506 {
18507 playerCharmer->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18508 playerCharmer->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18509 }
18510
18511 // Charmed stop charming
18512 if (IsPlayer())
18513 {
18514 ToPlayer()->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18515 ToPlayer()->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18516 }
18517
18518 // StopCastingCharm may remove a possessed pet?
18519 if (!IsInWorld())
18520 {
18521 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) is not in world but {} ({}) is trying to charm it!",
18522 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18523 return false;
18524 }
18525
18526 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18527 // prevent undefined behaviour
18528 if (aurApp && aurApp->GetRemoveMode())
18529 return false;
18530
18532 SetFaction(charmer->GetFaction());
18533
18534 // Set charmed
18535 charmer->SetCharm(this, true);
18536
18538
18539 if (IsCreature())
18540 {
18541 GetMotionMaster()->Clear(false);
18543 StopMoving();
18544
18545 if (charmer->IsPlayer() && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM) && ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_DEMON)
18546 {
18547 // Disable CreatureAI/SmartAI and switch to CharmAI when charmed by warlock
18548 Creature* charmed = ToCreature();
18549 charmed->NeedChangeAI = true;
18550 charmed->IsAIEnabled = false;
18551 }
18552 else
18553 {
18554 ToCreature()->AI()->OnCharmed(true);
18555 }
18556
18557 // Xinef: If creature can fly, add normal player flying flag (fixes speed)
18558 if (charmer->IsPlayer() && ToCreature()->CanFly())
18560 }
18561 else
18562 {
18563 Player* player = ToPlayer();
18564 if (player->isAFK())
18565 player->ToggleAFK();
18566
18567 player->SetClientControl(this, false); // verified
18568 }
18569
18570 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18571 // prevent undefined behaviour
18572 if (aurApp && aurApp->GetRemoveMode())
18573 return false;
18574
18575 // Pets already have a properly initialized CharmInfo, don't overwrite it.
18576 // Xinef: I need charmInfo for vehicle
18577 if (/*type != CHARM_TYPE_VEHICLE &&*/ !GetCharmInfo())
18578 {
18579 InitCharmInfo();
18580 if (type == CHARM_TYPE_POSSESS)
18582 else if (type != CHARM_TYPE_VEHICLE)
18583 {
18585
18586 // Xinef: convert charm npcs dont have pet bar so initialize them as defensive helpers
18587 if (type == CHARM_TYPE_CONVERT && IsCreature())
18589 }
18590 }
18591
18592 if (playerCharmer)
18593 {
18594 switch (type)
18595 {
18596 case CHARM_TYPE_VEHICLE:
18599 playerCharmer->SetClientControl(this, true); // verified
18600 playerCharmer->VehicleSpellInitialize();
18601 break;
18602 case CHARM_TYPE_POSSESS:
18607 playerCharmer->SetClientControl(this, true); // verified
18608 playerCharmer->PossessSpellInitialize();
18609 break;
18610 case CHARM_TYPE_CHARM:
18612 {
18614 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18615 {
18616 // to prevent client crash
18618
18619 // just to enable stat window
18620 if (GetCharmInfo())
18621 GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
18622
18623 // if charmed two demons the same session, the 2nd gets the 1st one's name
18624 SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped
18625 }
18626 }
18627 if (playerCharmer->m_seer != this)
18628 {
18630 playerCharmer->CharmSpellInitialize();
18631 }
18632 break;
18633 default:
18634 break;
18635 }
18636 }
18637 else if (IsPlayer())
18639
18640 if (Creature* creature = ToCreature())
18641 creature->RefreshSwimmingFlag();
18642
18643 if (IsPlayer())
18644 sScriptMgr->OnPlayerBeingCharmed(ToPlayer(), charmer, _oldFactionId, charmer->GetFaction());
18645
18646 return true;
18647}
@ UNIT_FIELD_PET_NAME_TIMESTAMP
Definition: UpdateFields.h:133
@ CHARM_TYPE_CONVERT
Definition: CharmInfo.h:48
@ REACT_DEFENSIVE
Definition: Unit.h:550
void OnCharmed(bool apply) override
Called when unit is charmed.
Definition: CreatureAI.cpp:36
void SetReactState(ReactStates state)
A creature can have 3 ReactStates : Agressive, Passive, Neutral.
Definition: Creature.h:95
void CharmSpellInitialize()
Definition: Player.cpp:9744
WorldObject * m_seer
Definition: Player.h:2338
void ToggleAFK()
Definition: Player.cpp:1304
void PossessSpellInitialize()
Definition: Player.cpp:9641
bool isAFK() const
Definition: Player.h:1137
void VehicleSpellInitialize()
Definition: Player.cpp:9669
void StopCastingBindSight(Aura *except=nullptr)
Definition: Player.cpp:13180
void InitPossessCreateSpells()
Definition: CharmInfo.cpp:77
void InitCharmCreateSpells()
Definition: CharmInfo.cpp:98
virtual float GetFollowAngle() const
Definition: Unit.h:1812
CharmInfo * InitCharmInfo()
Definition: Unit.cpp:15898
void MoveIdle()
Definition: MotionMaster.cpp:232

References _oldFactionId, AddUnitMovementFlag(), AddUnitState(), Creature::AI(), ASSERT, AttackStop(), CanFly(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_CONVERT, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, Player::CharmSpellInitialize(), CLASS_CONTEXT_PET_CHARM, CLASS_MAGE, CLASS_WARLOCK, MotionMaster::Clear(), CREATURE_TYPE_DEMON, AuraApplication::GetBase(), GetCharmerGUID(), GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFaction(), GetFollowAngle(), GameTime::GetGameTime(), Object::GetGUID(), GetMotionMaster(), AuraApplication::GetRemoveMode(), WorldObject::GetTransport(), CharmInfo::InitCharmCreateSpells(), InitCharmInfo(), CharmInfo::InitPossessCreateSpells(), Player::isAFK(), IsAIEnabled, IsClass(), Object::IsCreature(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Object::IsPlayer(), IsVehicle(), LOG_DEBUG, LOG_FATAL, Player::m_seer, MotionMaster::MoveFollow(), MotionMaster::MoveIdle(), MOVEMENTFLAG_FLYING, NeedChangeAI, CreatureAI::OnCharmed(), PET_FOLLOW_DIST, Player::PossessSpellInitialize(), REACT_DEFENSIVE, RemoveAurasByType(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), Creature::SetReactState(), SetUInt32Value(), SetUnitFlag(), sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sScriptMgr, StopAttackingInvalidTarget(), Player::StopCastingBindSight(), Player::StopCastingCharm(), StopMoving(), Object::ToCreature(), Player::ToggleAFK(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), CreatureTemplate::type, UNIT_FIELD_BYTES_0, UNIT_FIELD_PET_NAME_TIMESTAMP, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, and Player::VehicleSpellInitialize().

Referenced by Vehicle::AddPassenger(), AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), and Puppet::InitSummon().

◆ SetCharmerGUID()

void Unit::SetCharmerGUID ( ObjectGuid  owner)
inline

◆ SetCombatTimer()

void Unit::SetCombatTimer ( uint32  timer)
inline
892{ m_CombatTimer = timer; }

References m_CombatTimer.

◆ SetConfused()

void Unit::SetConfused ( bool  apply)
protected
18416{
18417 if (apply)
18418 {
18419 SetTarget();
18421 }
18422 else
18423 {
18424 if (IsAlive())
18425 {
18426 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == CONFUSED_MOTION_TYPE)
18427 {
18429 StopMoving();
18430 }
18431
18432 if (GetVictim())
18434 }
18435 }
18436
18437 // xinef: block / allow control to real mover (eg. charmer)
18438 if (IsPlayer())
18439 {
18440 if (m_movedByPlayer)
18441 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18442 //else
18443 // ToPlayer()->SetClientControl(this, !apply);
18444 }
18445}
@ CONFUSED_MOTION_TYPE
Definition: MotionMaster.h:44
void MoveConfused()
Enable the confusion movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:292

References CONFUSED_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveConfused(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), and Object::ToPlayer().

Referenced by SetControlled().

◆ SetContestedPvP()

void Unit::SetContestedPvP ( Player attackedPlayer = nullptr,
bool  lookForNearContestedGuards = true 
)
17332{
17334
17335 if (!player || ((attackedPlayer && (attackedPlayer == player || (player->duel && player->duel->Opponent == attackedPlayer))) || player->InBattleground()))
17336 return;
17337
17338 // check if there any guards that should care about the contested flag on player
17339 if (lookForNearContestedGuards)
17340 {
17341 std::list<Unit*> targets;
17344 Cell::VisitObjects(this, searcher, MAX_AGGRO_RADIUS);
17345
17346 // return if there are no contested guards found
17347 if (!targets.size())
17348 {
17349 return;
17350 }
17351 }
17352
17353 player->SetContestedPvPTimer(30000);
17355 {
17358 // call MoveInLineOfSight for nearby contested guards
17360 }
17362 {
17364 // call MoveInLineOfSight for nearby contested guards
17366 }
17367}
#define MAX_AGGRO_RADIUS
Definition: Unit.h:44
void SetPlayerFlag(PlayerFlags flags)
Definition: Player.h:1112
bool InBattleground() const
Definition: Player.h:2256
void SetContestedPvPTimer(uint32 newTime)
Definition: Player.h:1864

References WorldObject::AddToNotify(), AddUnitState(), Player::duel, GetCharmerOrOwnerPlayerOrPlayerItself(), HasUnitState(), Player::InBattleground(), MAX_AGGRO_RADIUS, NOTIFY_AI_RELOCATION, PLAYER_FLAGS_CONTESTED_PVP, Player::SetContestedPvPTimer(), Player::SetPlayerFlag(), UNIT_STATE_ATTACK_PLAYER, and Cell::VisitObjects().

Referenced by CombatStart(), CombatStartOnCast(), Spell::DoSpellHitOnUnit(), and WorldSession::HandlePlayerLoginFromDB().

◆ SetControlled()

void Unit::SetControlled ( bool  apply,
UnitState  state,
Unit source = nullptr,
bool  isFear = false 
)
18132{
18133 if (apply)
18134 {
18135 if (HasUnitState(state))
18136 return;
18137
18138 AddUnitState(state);
18139 switch (state)
18140 {
18141 case UNIT_STATE_STUNNED:
18142 SetStunned(true);
18143 break;
18144 case UNIT_STATE_ROOT:
18146 SetRooted(true);
18147 break;
18150 {
18153 // SendAutoRepeatCancel ?
18154 SetConfused(true);
18155 CastStop(0, false);
18156 }
18157 break;
18158 case UNIT_STATE_FLEEING:
18160 {
18163 // SendAutoRepeatCancel ?
18164 SetFeared(true, source, isFear);
18165 CastStop(0, false);
18166 }
18167 break;
18168 default:
18169 break;
18170 }
18171
18172 if (IsPlayer())
18173 {
18174 sScriptMgr->AnticheatSetRootACKUpd(ToPlayer());
18175 }
18176 }
18177 else
18178 {
18179 // xinef: moved from below, checked all SetX functions, no calls to currently modified state
18180 // xinef: added to each case because of return
18181 //ClearUnitState(state);
18182
18183 switch (state)
18184 {
18185 case UNIT_STATE_STUNNED:
18186 if (HasStunAura())
18187 return;
18188 ClearUnitState(state);
18189 SetStunned(false);
18190 break;
18191 case UNIT_STATE_ROOT:
18192 // Prevent creature_template_movement rooted flag from being removed on aura expiration.
18193 if (IsCreature())
18194 {
18195 if (ToCreature()->GetCreatureTemplate()->Movement.Rooted)
18196 {
18197 return;
18198 }
18199 }
18200
18201 if (HasRootAura() || GetVehicle())
18202 return;
18203 ClearUnitState(state);
18204 SetRooted(false);
18205 break;
18207 if (HasConfuseAura())
18208 return;
18209 ClearUnitState(state);
18210 SetConfused(false);
18211 break;
18212 case UNIT_STATE_FLEEING:
18213 if (HasFearAura())
18214 return;
18215 ClearUnitState(state);
18216 SetFeared(false);
18217 break;
18218 default:
18219 return;
18220 }
18221
18222 //ClearUnitState(state);
18223
18225 SetStunned(true);
18226 else
18227 {
18229 SetRooted(true);
18230
18232 SetConfused(true);
18234 {
18235 bool isFear = false;
18236 if (HasFearAura())
18237 {
18238 isFear = true;
18239 source = ObjectAccessor::GetUnit(*this, GetAuraEffectsByType(SPELL_AURA_MOD_FEAR).front()->GetCasterGUID());
18240 }
18241
18242 if (!source)
18243 {
18244 source = getAttackerForHelper();
18245 }
18246
18247 SetFeared(true, source, isFear);
18248 }
18249 }
18250 }
18251}
Definition: Unit.h:258
void SetFeared(bool apply, Unit *fearedBy=nullptr, bool isFear=false)
Definition: Unit.cpp:18383
bool HasStunAura() const
Definition: Unit.h:1756
void SetConfused(bool apply)
Definition: Unit.cpp:18415
void SetStunned(bool apply)
Definition: Unit.cpp:18253
Unit * getAttackerForHelper() const
Definition: Unit.cpp:755
bool HasConfuseAura() const
Definition: Unit.h:1754
void SetRooted(bool apply, bool isStun=false)
Definition: Unit.cpp:18301
bool HasRootAura() const
Definition: Unit.h:1755
bool HasFearAura() const
Definition: Unit.h:1753

References AddUnitState(), CastStop(), ClearUnitState(), getAttackerForHelper(), GetAuraEffectsByType(), ObjectAccessor::GetUnit(), GetVehicle(), HasConfuseAura(), HasFearAura(), HasRootAura(), HasStunAura(), HasUnitState(), Object::IsCreature(), Object::IsPlayer(), SendMeleeAttackStop(), SetConfused(), SetFeared(), SetRooted(), SetStunned(), SPELL_AURA_MOD_FEAR, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONFUSED, UNIT_STATE_FLEEING, UNIT_STATE_MELEE_ATTACKING, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by _ExitVehicle(), Vehicle::AddPassenger(), boss_ahune::boss_ahune(), boss_ouro::boss_ouro(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_palehoof::boss_palehoofAI::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), Creature::DoFleeToGetAssistance(), boss_skeram::DoTeleport(), CritterAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_falric::boss_falricAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_noth::boss_nothAI::EnterEvadeMode(), boss_thaddius_summon::boss_thaddius_summonAI::EnterEvadeMode(), boss_urom::boss_uromAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::EnterEvadeMode(), boss_svala::boss_svalaAI::EnterEvadeMode(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_shirrak_the_dead_watcher::EnterEvadeMode(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleAuraModRoot(), AuraEffect::HandleAuraModStun(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_gen_visual_dummy_stun::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_gen_visual_dummy_stun::HandleEffectRemove(), AuraEffect::HandleModConfuse(), AuraEffect::HandleModFear(), AuraEffect::HandlePreventFleeing(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_volazj::JustDied(), CritterAI::JustEngagedWith(), boss_skeram::JustSummoned(), npc_twilight_volunteer::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), npc_gunship_gunner::npc_gunship_gunnerAI::MovementInform(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_iron_watcher::npc_iron_watcherAI::MovementInform(), npc_buru_egg::npc_buru_egg(), npc_icc_blood_beast::npc_icc_blood_beastAI::npc_icc_blood_beastAI(), npc_raging_spirit::npc_raging_spiritAI::npc_raging_spiritAI(), npc_vengeful_shade::npc_vengeful_shadeAI::npc_vengeful_shadeAI(), spell_systems_shutdown_aura::OnApply(), spell_systems_shutdown_aura::OnRemove(), npc_akama_illidan::PathEndReached(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_skeram::Reset(), boss_volazj::Reset(), npc_twilight_summon::npc_twilight_summonAI::Reset(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_thaddius_summon::boss_thaddius_summonAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_thorim_pillar::boss_thorim_pillarAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), npc_iron_watcher::npc_iron_watcherAI::Reset(), boss_shirrak_the_dead_watcher::Reset(), boss_illidan_stormrage::Reset(), npc_akama_illidan::Reset(), npc_target_dummy::npc_target_dummyAI::Reset(), boss_illidan_stormrage::ScheduleAbilities(), Player::SetClientControl(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_ionar::boss_ionarAI::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_noth::boss_nothAI::StartGroundPhase(), boss_skeram::UpdateAI(), boss_volazj::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), npc_icc_blood_beast::npc_icc_blood_beastAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ SetCreateHealth()

◆ SetCreateMana()

◆ SetCreateStat()

void Unit::SetCreateStat ( Stats  stat,
float  val 
)
inline

◆ SetCreatorGUID()

◆ SetCritterGUID()

void Unit::SetCritterGUID ( ObjectGuid  guid)
inline

◆ SetCurrentCastedSpell()

void Unit::SetCurrentCastedSpell ( Spell pSpell)
4011{
4012 ASSERT(pSpell); // nullptr may be never passed here, use InterruptSpell or InterruptNonMeleeSpells
4013
4014 CurrentSpellTypes CSpellType = pSpell->GetCurrentContainer();
4015
4016 if (pSpell == m_currentSpells[CSpellType]) // avoid breaking self
4017 return;
4018
4019 bool bySelf = m_currentSpells[CSpellType] && m_currentSpells[CSpellType]->m_spellInfo->Id == pSpell->m_spellInfo->Id;
4020
4021 // break same type spell if it is not delayed
4022 InterruptSpell(CSpellType, false, true, bySelf);
4023
4024 // special breakage effects:
4025 switch (CSpellType)
4026 {
4028 {
4029 // generic spells always break channeled not delayed spells
4031 {
4032 if (!s->GetSpellInfo()->IsActionAllowedChannel())
4033 {
4035 }
4036 }
4037
4038 // autorepeat breaking
4040 {
4041 // break autorepeat if not Auto Shot
4042 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
4044 m_AutoRepeatFirstCast = true;
4045 }
4046
4047 // melee spells breaking
4049 {
4050 // break melee spells if cast time
4051 if (pSpell->GetCastTime() > 0)
4052 {
4054 }
4055 }
4056 if (pSpell->GetCastTime() > 0)
4058
4059 break;
4060 }
4062 {
4063 // channel spells always break generic non-delayed and any channeled spells
4065 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4066
4067 // it also does break autorepeat if not Auto Shot
4069 m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
4072
4073 break;
4074 }
4076 {
4077 // only Auto Shoot does not break anything
4078 if (pSpell->m_spellInfo->Id != 75)
4079 {
4080 // generic autorepeats break generic non-delayed and channeled non-delayed spells
4082 {
4083 if (!s->GetSpellInfo()->IsActionAllowedChannel())
4084 {
4086 }
4087 }
4088
4090 }
4091 // special action: set first cast flag
4092 m_AutoRepeatFirstCast = true;
4093
4094 break;
4095 }
4096
4097 default:
4098 // other spell types don't break anything now
4099 break;
4100 }
4101
4102 // current spell (if it is still here) may be safely deleted now
4103 if (m_currentSpells[CSpellType])
4104 m_currentSpells[CSpellType]->SetReferencedFromCurrent(false);
4105
4106 // set new current spell
4107 m_currentSpells[CSpellType] = pSpell;
4108 pSpell->SetReferencedFromCurrent(true);
4109
4110 pSpell->m_selfContainer = &(m_currentSpells[pSpell->GetCurrentContainer()]);
4111}
CurrentSpellTypes GetCurrentContainer() const
Definition: Spell.cpp:7865
Spell ** m_selfContainer
Definition: Spell.h:622

References AddUnitState(), ASSERT, CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, CURRENT_MELEE_SPELL, Spell::GetCastTime(), Spell::GetCurrentContainer(), GetCurrentSpell(), SpellInfo::Id, InterruptSpell(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_selfContainer, Spell::m_spellInfo, Spell::SetReferencedFromCurrent(), and UNIT_STATE_CASTING.

Referenced by Spell::prepare().

◆ setDeathState()

void Unit::setDeathState ( DeathState  s,
bool  despawn = false 
)
virtual

Reimplemented in Creature, Minion, Pet, and Player.

14655{
14656 // death state needs to be updated before RemoveAllAurasOnDeath() calls HandleChannelDeathItem(..) so that
14657 // it can be used to check creation of death items (such as soul shards).
14658 m_deathState = s;
14659
14660 if (s != DeathState::Alive && s != DeathState::JustRespawned)
14661 {
14662 CombatStop();
14665 ClearComboPointHolders(); // any combo points pointed to unit lost at it death
14666
14667 if (IsNonMeleeSpellCast(false))
14669
14670 UnsummonAllTotems(true);
14671 RemoveAllControlled(true);
14673 }
14674
14675 if (s == DeathState::JustDied)
14676 {
14677 // remove aurastates allowing special moves
14680
14681 GetMotionMaster()->Clear(false);
14683
14684 // Xinef: Remove Hover so the corpse can fall to the ground
14685 SetHover(false);
14686
14687 if (despawn)
14688 DisableSpline();
14689 else
14690 StopMoving();
14691
14692 // without this when removing IncreaseMaxHealth aura player may stuck with 1 hp
14693 // do not why since in IncreaseMaxHealth currenthealth is checked
14694 SetHealth(0);
14695 SetPower(getPowerType(), 0);
14696
14697 // Stop emote on death
14699
14700 // players in instance don't have ZoneScript, but they have InstanceScript
14702 zoneScript->OnUnitDeath(this);
14703 }
14704 else if (s == DeathState::JustRespawned)
14705 {
14706 RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
14707 }
14708}
@ UNIT_FLAG_SKINNABLE
Definition: UnitDefines.h:278
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1197
ZoneScript * GetZoneScript() const
Definition: Object.h:627
void ClearAllReactives()
Definition: Unit.cpp:17010
virtual bool SetHover(bool enable, bool packetOnly=false, bool updateAnimationTier=true)
Definition: Unit.cpp:20533
void ClearDiminishings()
Definition: Unit.h:1779
Definition: ZoneScript.h:26

References MotionMaster::Clear(), ClearAllReactives(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearDiminishings(), CombatStop(), HostileRefMgr::deleteReferences(), DisableSpline(), getHostileRefMgr(), WorldObject::GetInstanceScript(), GetMotionMaster(), getPowerType(), GetThreatMgr(), WorldObject::GetZoneScript(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), m_deathState, MotionMaster::MoveIdle(), RemoveAllAurasOnDeath(), RemoveAllControlled(), Object::RemoveFlag(), SetHealth(), SetHover(), SetPower(), SetUInt32Value(), StopMoving(), UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE, UNIT_NPC_EMOTESTATE, and UnsummonAllTotems().

Referenced by _ExitVehicle(), KillMagnetEvent::Execute(), Spell::finish(), WorldSession::HandlePetActionHelper(), AuraEffect::HandleSpiritOfRedemption(), Kill(), Creature::setDeathState(), and Player::setDeathState().

◆ SetDisableGravity()

◆ SetDisplayId()

◆ SetEmoteState()

void Unit::SetEmoteState ( Emote  emoteState)
inline

◆ SetExtraUnitMovementFlags()

void Unit::SetExtraUnitMovementFlags ( uint16  f)
inline

◆ SetFacingTo()

void Unit::SetFacingTo ( float  ori)
20370{
20371 Movement::MoveSplineInit init(this);
20372 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false);
20374 init.DisableTransportPathTransformations(); // It makes no sense to target global orientation
20375 init.SetFacing(ori);
20376 init.Launch();
20377}
ObjectGuid GetTransGUID() const override
Definition: Unit.cpp:18853

References Movement::MoveSplineInit::DisableTransportPathTransformations(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetTransGUID(), HasUnitMovementFlag(), Movement::MoveSplineInit::Launch(), MOVEMENTFLAG_ONTRANSPORT, Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_twinemperorsAI::DoAction(), npc_arthas::npc_arthasAI::DoAction(), Spell::EffectDistract(), ResetToHomeOrientation::Execute(), UtherBatteredHiltEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), DistractMovementGenerator::Finalize(), Creature::FocusTarget(), spell_item_unusual_compass::HandleDummy(), spell_drakkari_colossus_face_me::HandleScriptEffect(), boss_grand_warlock_nethekurse::IntroRP(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::JustDied(), boss_ingvar_the_plunderer::JustSummoned(), boss_nalorakk::MoveInLineOfSight(), boss_algalon_the_observer::boss_algalon_the_observerAI::MovementInform(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::MovementInform(), boss_zuljin::MovementInform(), npc_harrison_jones::MovementInform(), boss_onyxia::MovementInform(), npc_twilight_volunteer::MovementInform(), boss_eadric::boss_eadricAI::MovementInform(), boss_paletress::boss_paletressAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_essence_of_suffering::boss_essence_of_sufferingAI::MovementInform(), boss_essence_of_desire::boss_essence_of_desireAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), boss_saviana_ragefire::boss_saviana_ragefireAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), spell_lurker_below_spout::OnPeriodic(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), SmartAI::PausePath(), SmartScript::ProcessAction(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), boss_illidan_stormrage::ScheduleAbilities(), boss_nightbane::ScheduleFly(), Player::SetClientControl(), boss_grand_warlock_nethekurse::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_chesspiece::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), CreatureAI::TriggerAlert(), RotateMovementGenerator::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), boss_onyxia::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_general_andorov::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), npc_argent_soldier::npc_argent_soldierAI::WaypointReached(), npc_ranger_lilatha::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetFacingToObject()

void Unit::SetFacingToObject ( WorldObject object)
Todo:
figure out under what conditions creature will move towards object instead of facing it where it currently is.
20380{
20381 // never face when already moving
20382 if (!IsStopped())
20383 return;
20384
20386 Movement::MoveSplineInit init(this);
20387 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
20388 init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming
20389 init.Launch();
20390}
bool IsStopped() const
Definition: Unit.h:1680

References Position::GetAngle(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsStopped(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), npc_ranshalla::npc_ranshallaAI::DoChannelTorchSpell(), npc_forest_frog::DoSpawnRandom(), spell_yogg_saron_target_selectors::HandleScript(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_maiev_illidan::IsSummonedBy(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_illidan_stormrage::JustSummoned(), npc_drakuru_shackles::npc_drakuru_shacklesAI::LockRageclaw(), npc_acherus_necromancer::npc_acherus_necromancerAI::MovementInform(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::MovementInform(), boss_zuljin::MovementInform(), npc_harrison_jones::MovementInform(), npc_akama_illidan::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), npc_image_of_medivh::npc_image_of_medivhAI::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_nightbane::ScheduleFly(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), boss_the_lurker_below::SchedulerPhaseOne(), boss_shade_of_aran::SetGUID(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::SetGUID(), npc_harrison_jones::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_death_knight_initiate::npc_death_knight_initiateAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_magister_aledis::StartFight(), boss_hydross_the_unstable::SummonMovementInform(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_pilgrims_bounty_chair::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_hidden_cultist::npc_hidden_cultistAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI(), npc_ranshalla::npc_ranshallaAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), npc_scarlet_miner::npc_scarlet_minerAI::WaypointReached(), and npc_kaya_flathoof::npc_kaya_flathoofAI::WaypointReached().

◆ SetFaction()

void Unit::SetFaction ( uint32  faction)
10127{
10129 if (IsCreature())
10131}
void UpdateMoveInLineOfSightState()
Definition: Creature.cpp:2596

References Object::IsCreature(), SetUInt32Value(), Object::ToCreature(), UNIT_FIELD_FACTIONTEMPLATE, and Creature::UpdateMoveInLineOfSightState().

Referenced by npc_hidden_cultist::npc_hidden_cultistAI::AttackPlayer(), GameObject::CastSpell(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_kalecgos::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSummonType(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::EnterEvadeMode(), BattlegroundEY::EventTeamCapturedPoint(), AuraEffect::HandleAuraModFaction(), BattlegroundIC::HandleCapturedNodes(), spell_q12096_q12092_dummy::HandleDummy(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFactionIdCommand(), npc_commandscript::HandleNpcSetFactionTempIdCommand(), spell_mutate_explode_bug::HandleOnHit(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_item_draenic_pale_ale::HandleSummon(), npc_cork_gizelton::npc_cork_gizeltonAI::ImmuneFlagSet(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_general_andorov::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), Minion::InitStats(), TempSummon::InitStats(), InitTamedPet(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), FollowerAI::JustRespawned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_volkhan::boss_volkhanAI::JustSummoned(), boss_balinda::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), Pet::LoadPetFromDB(), boss_twilight_corrupter::MoveInLineOfSight(), npc_akama_shade::MovementInform(), BattlegroundAB::NodeOccupied(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::npc_scarlet_miner_cartAI(), spell_brewfest_reveler_transform::OnApply(), npc_chesspiece::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_nexus::instance_nexus_InstanceMapScript::OnCreatureCreate(), instance_black_temple::instance_black_temple_InstanceMapScript::OnCreatureCreate(), boss_azuregos::OnGossipSelect(), InstanceScript::OnPlayerEnter(), npc_prospector_remtravel::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_lakota_windsong::OnQuestAccept(), npc_paoka_swiftmountain::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_maxx_a_million_escort::OnQuestAccept(), npc_kaya_flathoof::OnQuestAccept(), npc_wizzlecrank_shredder::OnQuestAccept(), npc_ame::OnQuestAccept(), npc_ranshalla::OnQuestAccept(), npc_lurgglbr::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_apothecary_hanes::OnQuestAccept(), npc_bessy::OnQuestAccept(), npc_isla_starmane::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), BattlegroundAV::PopulateNode(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), RemoveCharmedBy(), boss_doomrel::boss_doomrelAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_coren_direbrew::Reset(), npc_direbrew_minion::Reset(), npc_aquementas::npc_aquementasAI::Reset(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), npc_captured_rageclaw::npc_captured_rageclawAI::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), RestoreFaction(), SetCharmedBy(), Player::SetFactionForRace(), Player::SetGameMaster(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), BattlegroundIC::SetupBattleground(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::SpawnCreature(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_professor_phizzlethorpe::npc_professor_phizzlethorpeAI::sQuestAccept(), npc_ranger_lilatha::sQuestAccept(), npc_corporal_keeshan::npc_corporal_keeshanAI::sQuestAccept(), npc_muglash::npc_muglashAI::sQuestAccept(), npc_wounded_blood_elf::npc_wounded_blood_elfAI::sQuestAccept(), FollowerAI::StartFollow(), npc_deathstalker_fearleia::SummonCreatureWithRandomTarget(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), Spell::SummonGuardian(), Player::SummonPet(), WorldObject::SummonTrigger(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), npc_sergeant_bly::npc_sergeant_blyAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_magister_aledis::UpdateAI(), npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI::UpdateAI(), Creature::UpdateEntry(), npc_magwin::npc_magwinAI::UpdateEscortAI(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ SetFeared()

void Unit::SetFeared ( bool  apply,
Unit fearedBy = nullptr,
bool  isFear = false 
)
protected
18384{
18385 if (apply)
18386 {
18387 SetTarget();
18388 GetMotionMaster()->MoveFleeing(fearedBy, isFear ? 0 : sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_FLEE_DELAY));
18389 }
18390 else
18391 {
18392 if (IsAlive())
18393 {
18394 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == FLEEING_MOTION_TYPE)
18395 {
18397 StopMoving();
18398 }
18399
18400 if (GetVictim())
18402 }
18403 }
18404
18405 // xinef: block / allow control to real mover (eg. charmer)
18406 if (IsPlayer())
18407 {
18408 if (m_movedByPlayer)
18409 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18410 //else
18411 // ToPlayer()->SetClientControl(this, !apply);
18412 }
18413}
@ FLEEING_MOTION_TYPE
Definition: MotionMaster.h:49
@ CONFIG_CREATURE_FAMILY_FLEE_DELAY
Definition: WorldConfig.h:237
void MoveFleeing(Unit *enemy, uint32 time=0)
Enable the target's fleeing movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:781

References CONFIG_CREATURE_FAMILY_FLEE_DELAY, FLEEING_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveFleeing(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), sWorld, and Object::ToPlayer().

Referenced by SetControlled().

◆ SetFeatherFall()

bool Unit::SetFeatherFall ( bool  enable,
bool  packetOnly = false 
)
virtual

Reimplemented in Player, and Creature.

20512{
20514 return false;
20515
20516 if (enable)
20518 else
20520
20521 return true;
20522}
@ MOVEMENTFLAG_FALLING_SLOW
Definition: UnitDefines.h:396

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_FALLING_SLOW, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraFeatherFall(), debug_commandscript::HandleDebugMoveflagsCommand(), Player::SetFeatherFall(), and Creature::SetFeatherFall().

◆ SetFullHealth()

◆ SetHealth()

void Unit::SetHealth ( uint32  val)
15580{
15581 if (getDeathState() == DeathState::JustDied)
15582 val = 0;
15583 else if (IsPlayer() && getDeathState() == DeathState::Dead)
15584 val = 1;
15585 else
15586 {
15587 uint32 maxHealth = GetMaxHealth();
15588 if (maxHealth < val)
15589 val = maxHealth;
15590 }
15591
15592 float prevHealthPct = GetHealthPct();
15593
15595
15596 // mobs that are now or were below 30% need to update their speed
15597 if (IsCreature() && !(IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) && (prevHealthPct < 30.0 || HealthBelowPct(30)))
15598 {
15599 UpdateSpeed(MOVE_RUN, false);
15600 }
15601
15602 // group update
15603 if (IsPlayer())
15604 {
15605 Player* player = ToPlayer();
15606 if (player->NeedSendSpectatorData())
15608
15609 if (player->GetGroup())
15611 }
15612 else if (Pet* pet = ToCreature()->ToPet())
15613 {
15614 if (pet->isControlled())
15615 {
15616 if (Unit* owner = GetOwner())
15617 if (Player* player = owner->ToPlayer())
15618 {
15619 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15620 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15621
15622 if (player->GetGroup())
15624 }
15625 }
15626 }
15627}
@ GROUP_UPDATE_FLAG_CUR_HP
Definition: Group.h:101
@ GROUP_UPDATE_FLAG_PET_CUR_HP
Definition: Group.h:113
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition: ArenaSpectator.h:62
bool NeedSendSpectatorData() const
Definition: Player.cpp:15426
void SetGroupUpdateFlag(uint32 flag)
Definition: Player.h:2477
float GetHealthPct() const
Definition: Unit.h:1035

References WorldObject::FindMap(), getDeathState(), Player::GetGroup(), Object::GetGUID(), GetHealthPct(), GetMaxHealth(), GetOwner(), GROUP_UPDATE_FLAG_CUR_HP, GROUP_UPDATE_FLAG_PET_CUR_HP, HealthBelowPct(), IsControlledByPlayer(), Object::IsCreature(), IsPet(), Object::IsPlayer(), MOVE_RUN, Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_HEALTH, and UpdateSpeed().

Referenced by boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), Player::BuildPlayerRepop(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_alar::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Spell::EffectSummonType(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_oculus_soar_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyHPCommand(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcSetLevelCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), npc_echo_of_medivh::HandlePieceJustDied(), spell_stinky_precious_decimate::HandleScript(), spell_ahune_synch_health::HandleScript(), AuraEffect::HandleSpiritOfRedemption(), npc_pet_pri_lightwell::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustReachedHome(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustReachedHome(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_nether_drake::npc_nether_drakeAI::MovementInform(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Player::ProcessDelayedOperations(), boss_vaelastrasz::boss_vaelAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetAllPowers(), Player::RestoreHealthAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetFullHealth(), SetMaxHealth(), boss_headless_horseman::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ SetHover()

bool Unit::SetHover ( bool  enable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
virtual

Reimplemented in Creature, and Player.

20534{
20536 return false;
20537
20538 float hoverHeight = GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
20539
20540 if (enable)
20541 {
20543 if (hoverHeight && GetPositionZ() - GetFloorZ() < hoverHeight)
20544 UpdateHeight(GetPositionZ() + hoverHeight);
20545 }
20546 else
20547 {
20549 if (hoverHeight && (!isDying() || !IsCreature()))
20550 {
20551 float newZ = std::max<float>(GetFloorZ(), GetPositionZ() - hoverHeight);
20553 UpdateHeight(newZ);
20554 }
20555 SendMovementFlagUpdate(); // pussywizard: needed for falling after death (instead of falling onto air at hover height)
20556 }
20557
20558 return true;
20559}
void UpdateAllowedPositionZ(float x, float y, float &z, float *groundZ=nullptr) const
Definition: Object.cpp:1559
float GetFloorZ() const
Definition: Object.cpp:3027
void UpdateHeight(float newZ)
Only server-side height update, does not broadcast to client.
Definition: Unit.cpp:19901
void SendMovementFlagUpdate(bool self=false)
Definition: Unit.cpp:16787
bool isDying() const
Definition: Unit.h:1711

References AddUnitMovementFlag(), Object::GetFloatValue(), WorldObject::GetFloorZ(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), HasUnitMovementFlag(), Object::IsCreature(), isDying(), MOVEMENTFLAG_HOVER, RemoveUnitMovementFlag(), SendMovementFlagUpdate(), UNIT_FIELD_HOVERHEIGHT, WorldObject::UpdateAllowedPositionZ(), and UpdateHeight().

Referenced by AuraEffect::HandleAuraHover(), debug_commandscript::HandleDebugMoveflagsCommand(), setDeathState(), Creature::SetHover(), and Player::SetHover().

◆ SetImmuneToAll()

void Unit::SetImmuneToAll ( bool  apply,
bool  keepCombat = false 
)
inline
871{ SetImmuneToPC(apply, keepCombat); SetImmuneToNPC(apply, keepCombat); }
void SetImmuneToNPC(bool apply, bool keepCombat=false)
Definition: Unit.cpp:13711

References SetImmuneToNPC(), and SetImmuneToPC().

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), boss_chromaggus::boss_chromaggusAI::boss_chromaggusAI(), boss_nalorakk::boss_nalorakk(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_broggok::DoAction(), boss_grand_warlock_nethekurse::DoAction(), boss_felblood_kaelthas::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_ambassador_hellmaw::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), boss_skeram::DoTeleport(), Spell::EffectSummonType(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), spell_uldaman_stoned_aura::HandleEffectApply(), spell_uldaman_stoned_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_item_draenic_pale_ale::HandleSummon(), boss_majordomo::boss_majordomoAI::InitializeAI(), boss_captain_skarloc::InitializeAI(), boss_taldaram::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::InitializeAI(), Player::InitStatsForLevel(), boss_falric::boss_falricAI::JustEngagedWith(), boss_marwyn::boss_marwynAI::JustEngagedWith(), boss_moroes::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_rinji::npc_rinjiAI::JustRespawned(), npc_isla_starmane::npc_isla_starmaneAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_skeram::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), boss_captain_skarloc::MovementInform(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_sister_svalna::boss_sister_svalnaAI::MovementInform(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_memory::npc_memoryAI::npc_memoryAI(), npc_rinji::npc_rinjiAI::npc_rinjiAI(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::npc_scarlet_miner_cartAI(), instance_zulaman::instance_zulaman_InstanceMapScript::OnCreatureCreate(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_skeram::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_marwyn::boss_marwynAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), boss_svala::boss_svalaAI::Reset(), npc_thassarian::npc_thassarianAI::Reset(), boss_ambassador_hellmaw::Reset(), boss_broggok::Reset(), boss_grand_warlock_nethekurse::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_svala::boss_svalaAI::SetData(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_chromaggus::boss_chromaggusAI::SetGUID(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_rinji::npc_rinjiAI::sQuestAccept(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_skeram::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_anzu::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), and npc_franklin::npc_franklinAI::UpdateAI().

◆ SetImmuneToNPC()

◆ SetImmuneToPC()

void Unit::SetImmuneToPC ( bool  apply,
bool  keepCombat = false 
)
13703{
13704 (void)keepCombat;
13705 if (apply)
13707 else
13709}

References RemoveUnitFlag(), SetUnitFlag(), and UNIT_FLAG_IMMUNE_TO_PC.

Referenced by boss_victor_nefarius::boss_victor_nefariusAI::BeginEvent(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), ClearInCombat(), npc_magister_aledis::DamageTaken(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), boss_tenris_mirkblood::EnterEvadeMode(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectRemove(), spell_chapter2_persuasive_strike::HandleHit(), boss_felmyst::InitializeAI(), boss_blackheart_the_inciter::JustEngagedWith(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), npc_omen::npc_omenAI::MovementInform(), npc_omen::npc_omenAI::npc_omenAI(), instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), npc_kaya_flathoof::OnQuestAccept(), boss_doomrel::boss_doomrelAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_tenris_mirkblood::Reset(), boss_julianne::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_a_special_surprise::npc_a_special_surpriseAI::Reset(), npc_coren_direbrew::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), boss_blackheart_the_inciter::Reset(), boss_magtheridon::Reset(), npc_magister_aledis::Reset(), boss_magtheridon::ScheduleCombatEvents(), SetImmuneToAll(), SetInCombatState(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), boss_felmyst::StartIntro(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), go_blood_drenched_door::go_blood_drenched_doorAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_magister_aledis::UpdateAI(), and npc_tallhorn_stag::npc_tallhorn_stagAI::UpdateAI().

◆ SetInCombatState()

void Unit::SetInCombatState ( bool  PvP,
Unit enemy = nullptr,
uint32  duration = 0 
)
13834{
13835 // only alive units can be in combat
13836 if (!IsAlive())
13837 return;
13838
13839 if (PvP)
13840 m_CombatTimer = std::max<uint32>(GetCombatTimer(), std::max<uint32>(5500, duration));
13841 else if (duration)
13842 m_CombatTimer = std::max<uint32>(GetCombatTimer(), duration);
13843
13845 return;
13846
13847 // xinef: if we somehow engage in combat (scripts, dunno) with player, remove this flag so he can fight back
13848 if (IsCreature() && enemy && IsImmuneToPC() && enemy->GetCharmerOrOwnerPlayerOrPlayerItself())
13849 SetImmuneToPC(false); // unit has engaged in combat, remove immunity so players can fight back
13850
13851 if (IsInCombat())
13852 return;
13853
13855
13856 if (Creature* creature = ToCreature())
13857 {
13858 // Set home position at place of engaging combat for escorted creatures
13859 if ((IsAIEnabled && creature->AI()->IsEscorted()) ||
13860 GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE ||
13861 GetMotionMaster()->GetCurrentMovementGeneratorType() == ESCORT_MOTION_TYPE)
13862 creature->SetHomePosition(GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
13863
13864 if (enemy)
13865 {
13866 creature->UpdateLeashExtensionTime();
13867
13868 if (IsAIEnabled)
13869 creature->AI()->JustEngagedWith(enemy);
13870
13871 if (creature->GetFormation())
13872 creature->GetFormation()->MemberEngagingTarget(creature, enemy);
13873
13874 sScriptMgr->OnUnitEnterCombat(creature, enemy);
13875 }
13876
13877 creature->RefreshSwimmingFlag();
13878
13879 if (IsPet())
13880 {
13881 UpdateSpeed(MOVE_RUN, true);
13882 UpdateSpeed(MOVE_SWIM, true);
13883 UpdateSpeed(MOVE_FLIGHT, true);
13884 }
13885
13886 if (!(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT))
13887 Dismount();
13888 if (!IsStandState()) // pussywizard: already done in CombatStart(target, initialAggro) for the target, but when aggro'ing from MoveInLOS CombatStart is not called!
13890 }
13891
13892 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
13893 {
13894 Unit* controlled = *itr;
13895 ++itr;
13896
13897 // Xinef: Dont set combat for passive units, they will evade in next update...
13898 if (controlled->IsCreature() && controlled->ToCreature()->HasReactState(REACT_PASSIVE))
13899 continue;
13900
13901 controlled->SetInCombatState(PvP, enemy, duration);
13902 }
13903
13904 if (Player* player = this->ToPlayer())
13905 {
13906 sScriptMgr->OnPlayerEnterCombat(player, enemy);
13907 }
13908}
@ ESCORT_MOTION_TYPE
Definition: MotionMaster.h:57
@ WAYPOINT_MOTION_TYPE
Definition: MotionMaster.h:41
@ MOVE_FLIGHT
Definition: UnitDefines.h:357
@ MOVE_SWIM
Definition: UnitDefines.h:354
@ CREATURE_TYPE_NON_COMBAT_PET
Definition: SharedDefines.h:2650
@ CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT
Definition: SharedDefines.h:2717
bool HasReactState(ReactStates state) const
Definition: Creature.h:97
uint32 GetCombatTimer() const
Definition: Unit.h:891
void SetInCombatState(bool PvP, Unit *enemy=nullptr, uint32 duration=0)
Definition: Unit.cpp:13833
bool IsStandState() const
Definition: Unit.cpp:16803

References CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT, CREATURE_TYPE_NON_COMBAT_PET, Dismount(), ESCORT_MOTION_TYPE, GetCharmerOrOwnerPlayerOrPlayerItself(), GetCombatTimer(), GetCreatureType(), GetMotionMaster(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Creature::HasReactState(), HasUnitState(), IsAIEnabled, IsAlive(), Object::IsCreature(), IsImmuneToPC(), IsInCombat(), IsPet(), IsStandState(), m_CombatTimer, m_Controlled, MOVE_FLIGHT, MOVE_RUN, MOVE_SWIM, REACT_PASSIVE, SetImmuneToPC(), SetInCombatState(), SetStandState(), SetUnitFlag(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_IN_COMBAT, UNIT_STAND_STATE_STAND, UNIT_STATE_EVADE, UpdateSpeed(), and WAYPOINT_MOTION_TYPE.

Referenced by Spell::DoSpellHitOnUnit(), SetInCombatState(), and SetInCombatWith().

◆ SetInCombatWith()

void Unit::SetInCombatWith ( Unit enemy,
uint32  duration = 0 
)
13676{
13677 // Xinef: Dont allow to start combat with triggers
13678 if (enemy->IsCreature() && enemy->ToCreature()->IsTrigger())
13679 return;
13680
13681 Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf();
13682 if (eOwner->IsPvP() || eOwner->IsFFAPvP())
13683 {
13684 SetInCombatState(true, enemy, duration);
13685 return;
13686 }
13687
13688 // check for duel
13689 if (eOwner->IsPlayer() && eOwner->ToPlayer()->duel)
13690 {
13691 Unit const* myOwner = GetCharmerOrOwnerOrSelf();
13692 if (((Player const*)eOwner)->duel->Opponent == myOwner)
13693 {
13694 SetInCombatState(true, enemy, duration);
13695 return;
13696 }
13697 }
13698
13699 SetInCombatState(false, enemy, duration);
13700}

References Player::duel, GetCharmerOrOwnerOrSelf(), Object::IsCreature(), IsFFAPvP(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), SetInCombatState(), Object::ToCreature(), and Object::ToPlayer().

Referenced by Attack(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), CombatStart(), CombatStartOnCast(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), Spell::DoAllEffectOnTarget(), CreatureAI::DoZoneInCombat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), spell_herald_volzaj_insanity::HandleDummyEffect(), boss_chromaggus::boss_chromaggusAI::PathEndReached(), SmartScript::ProcessAction(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), and npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI().

◆ SetInFront()

◆ SetInstantCast()

void Unit::SetInstantCast ( bool  set)
inline
1507{ _instantCast = set; }

References _instantCast.

Referenced by AuraEffect::HandleModCastingSpeed().

◆ SetLastDamagedTargetGuid()

void Unit::SetLastDamagedTargetGuid ( ObjectGuid const &  guid)
inline

◆ SetLastExtraAttackSpell()

void Unit::SetLastExtraAttackSpell ( uint32  spellId)
inline
950{ _lastExtraAttackSpell = spellId; }

References _lastExtraAttackSpell.

Referenced by Spell::_handle_finish_phase().

◆ SetLastManaUse()

void Unit::SetLastManaUse ( uint32  spellCastTime)
inline
1077{ m_lastManaUse = spellCastTime; }

References m_lastManaUse.

Referenced by Spell::TakePower().

◆ SetLevel()

◆ SetMaxHealth()

void Unit::SetMaxHealth ( uint32  val)
15630{
15631 if (!val)
15632 val = 1;
15633
15634 uint32 health = GetHealth();
15636
15637 // group update
15638 if (IsPlayer())
15639 {
15640 Player* player = ToPlayer();
15641 if (player->NeedSendSpectatorData())
15643
15644 if (player->GetGroup())
15646 }
15647 else if (Pet* pet = ToCreature()->ToPet())
15648 {
15649 if (pet->isControlled())
15650 {
15651 if (Unit* owner = GetOwner())
15652 if (Player* player = owner->ToPlayer())
15653 {
15654 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15655 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15656
15657 if (player->GetGroup())
15659 }
15660 }
15661 }
15662
15663 if (val < health)
15664 SetHealth(val);
15665}
@ GROUP_UPDATE_FLAG_MAX_HP
Definition: Group.h:102
@ GROUP_UPDATE_FLAG_PET_MAX_HP
Definition: Group.h:114

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetHealth(), GetOwner(), GROUP_UPDATE_FLAG_MAX_HP, GROUP_UPDATE_FLAG_PET_MAX_HP, Object::IsPlayer(), Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetHealth(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXHEALTH.

Referenced by boss_xt002::boss_xt002AI::DoAction(), Spell::EffectSummonType(), modify_commandscript::HandleModifyHPCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_pet_pri_lightwell::InitializeAI(), Player::InitStatsForLevel(), boss_skeram::JustSummoned(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), Creature::SelectLevel(), npc_pet_hunter_snake_trap::UpdateAI(), Creature::UpdateMaxHealth(), Guardian::UpdateMaxHealth(), and Player::UpdateMaxHealth().

◆ SetMaxPower()

void Unit::SetMaxPower ( Powers  power,
uint32  val 
)
15719{
15720 uint32 cur_power = GetPower(power);
15721 SetStatInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power, val);
15722
15723 // group update
15724 if (IsPlayer())
15725 {
15726 Player* player = ToPlayer();
15727 if (getPowerType() == power && player->NeedSendSpectatorData())
15728 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15729
15730 if (player->GetGroup())
15732 }
15733 else if (Pet* pet = ToCreature()->ToPet())
15734 {
15735 if (pet->isControlled())
15736 {
15737 Unit* owner = GetOwner();
15738 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15740 }
15741 }
15742
15743 if (val < cur_power)
15744 SetPower(power, val);
15745}
@ GROUP_UPDATE_FLAG_PET_MAX_POWER
Definition: Group.h:117
@ GROUP_UPDATE_FLAG_MAX_POWER
Definition: Group.h:105
void SetStatInt32Value(uint16 index, int32 value)
Definition: Object.cpp:787

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetOwner(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_MAX_POWER, GROUP_UPDATE_FLAG_PET_MAX_POWER, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetPower(), Object::SetStatInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::Create(), Pet::CreateBaseAtTamed(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), Creature::SelectLevel(), setPowerType(), Creature::UpdateMaxPower(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ SetMinion()

void Unit::SetMinion ( Minion minion,
bool  apply 
)
10781{
10782 LOG_DEBUG("entities.unit", "SetMinion {} for {}, apply {}", minion->GetEntry(), GetEntry(), apply);
10783
10784 if (apply)
10785 {
10786 if (minion->GetOwnerGUID())
10787 {
10788 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10789 return;
10790 }
10791
10792 minion->SetOwnerGUID(GetGUID());
10793
10794 m_Controlled.insert(minion);
10795
10796 if (IsPlayer())
10797 {
10798 minion->m_ControlledByPlayer = true;
10800 }
10801
10802 // Can only have one pet. If a new one is summoned, dismiss the old one.
10803 if (minion->IsGuardianPet())
10804 {
10805 if (Guardian* oldPet = GetGuardianPet())
10806 {
10807 if (oldPet != minion && (oldPet->IsPet() || minion->IsPet() || oldPet->GetEntry() != minion->GetEntry()))
10808 {
10809 // remove existing minion pet
10810 if (Pet* oldPetAsPet = oldPet->ToPet())
10811 {
10812 oldPetAsPet->Remove(PET_SAVE_NOT_IN_SLOT);
10813 }
10814 else
10815 {
10816 oldPet->UnSummon();
10817 }
10818
10819 SetPetGUID(minion->GetGUID());
10821 }
10822 }
10823 else
10824 {
10825 SetPetGUID(minion->GetGUID());
10827 }
10828 }
10829
10831 {
10833 }
10834
10835 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10836 {
10837 SetCritterGUID(minion->GetGUID());
10838 }
10839
10840 // PvP, FFAPvP
10842
10843 // Ghoul pets have energy instead of mana (is anywhere better place for this code?)
10844 if (minion->IsPetGhoul() || minion->GetEntry() == 24207 /*ENTRY_ARMY_OF_THE_DEAD*/)
10845 minion->setPowerType(POWER_ENERGY);
10846
10847 if (IsPlayer())
10848 {
10849 // Send infinity cooldown - client does that automatically but after relog cooldown needs to be set again
10850 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10851
10852 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10853 ToPlayer()->AddSpellAndCategoryCooldowns(spellInfo, 0, nullptr, true);
10854 }
10855 }
10856 else
10857 {
10858 if (minion->GetOwnerGUID() != GetGUID())
10859 {
10860 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10861 return;
10862 }
10863
10864 m_Controlled.erase(minion);
10865
10866 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10867 {
10868 if (GetCritterGUID() == minion->GetGUID())
10870 }
10871
10872 if (minion->IsGuardianPet())
10873 {
10874 if (GetPetGUID() == minion->GetGUID())
10876 }
10877 else if (minion->IsTotem())
10878 {
10879 // All summoned by totem minions must disappear when it is removed.
10880 if (SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(minion->ToTotem()->GetSpell()))
10881 {
10882 for (int i = 0; i < MAX_SPELL_EFFECTS; ++i)
10883 {
10884 if (spInfo->Effects[i].Effect != SPELL_EFFECT_SUMMON)
10885 continue;
10886
10887 RemoveAllMinionsByEntry(spInfo->Effects[i].MiscValue);
10888 }
10889 }
10890 }
10891
10892 if (IsPlayer())
10893 {
10894 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10895 // Remove infinity cooldown
10896 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10897 ToPlayer()->SendCooldownEvent(spellInfo);
10898
10899 // xinef: clear spell book
10900 if (m_Controlled.empty())
10902 }
10903
10904 //if (minion->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10905 {
10907 {
10908 // Check if there is another minion
10909 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10910 {
10911 // do not use this check, creature do not have charm guid
10912 //if (GetCharmGUID() == (*itr)->GetGUID())
10913 if (GetGUID() == (*itr)->GetCharmerGUID())
10914 continue;
10915
10916 //ASSERT((*itr)->GetOwnerGUID() == GetGUID());
10917 if ((*itr)->GetOwnerGUID() != GetGUID())
10918 {
10919 OutDebugInfo();
10920 (*itr)->OutDebugInfo();
10921 ABORT();
10922 }
10923 ASSERT((*itr)->IsCreature());
10924
10925 if (!(*itr)->HasUnitTypeMask(UNIT_MASK_CONTROLLABLE_GUARDIAN))
10926 continue;
10927
10928 if (AddGuidValue(UNIT_FIELD_SUMMON, (*itr)->GetGUID()))
10929 {
10930 // show another pet bar if there is no charm bar
10931 if (IsPlayer() && !GetCharmGUID())
10932 {
10933 if ((*itr)->IsPet())
10935 else
10937 }
10938 }
10939 break;
10940 }
10941 }
10942 }
10943 }
10944}
@ PET_SAVE_NOT_IN_SLOT
Definition: PetDefines.h:45
@ SPELL_EFFECT_SUMMON
Definition: SharedDefines.h:817
@ SUMMON_TYPE_MINIPET
Definition: SharedDefines.h:3549
const SummonPropertiesEntry *const m_Properties
Definition: TemporarySummon.h:64
bool IsGuardianPet() const
Definition: TemporarySummon.cpp:391
bool IsPetGhoul() const
Definition: TemporarySummon.h:85
void PetSpellInitialize()
Definition: Player.cpp:9569
uint32 GetSpell(uint8 slot=0) const
Definition: Totem.h:59
void OutDebugInfo() const
Definition: Unit.cpp:20064
ObjectGuid GetCritterGUID() const
Definition: Unit.h:680
void SetOwnerGUID(ObjectGuid owner)
Definition: Unit.cpp:10668
void SetCritterGUID(ObjectGuid guid)
Definition: Unit.h:679
void setPowerType(Powers power)
Definition: Unit.cpp:10049
void RemoveAllMinionsByEntry(uint32 entry)
Definition: Unit.cpp:10958
uint32 Type
Definition: DBCStructure.h:1914

References ABORT, Object::AddGuidValue(), Player::AddSpellAndCategoryCooldowns(), ASSERT, Player::CharmSpellInitialize(), ObjectGuid::Empty, Object::GetByteValue(), GetCharmGUID(), GetCritterGUID(), Object::GetEntry(), GetGuardianPet(), Object::GetGUID(), GetOwnerGUID(), GetPetGUID(), Totem::GetSpell(), Object::GetUInt32Value(), HasUnitTypeMask(), SpellInfo::IsCooldownStartedOnEvent(), Minion::IsGuardianPet(), IsPet(), Minion::IsPetGhoul(), Object::IsPlayer(), IsTotem(), LOG_DEBUG, LOG_FATAL, m_Controlled, m_ControlledByPlayer, TempSummon::m_Properties, MAX_SPELL_EFFECTS, OutDebugInfo(), PET_SAVE_NOT_IN_SLOT, Player::PetSpellInitialize(), POWER_ENERGY, RemoveAllMinionsByEntry(), Object::RemoveGuidValue(), Player::SendCooldownEvent(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCritterGUID(), SetMinionGUID(), SetOwnerGUID(), SetPetGUID(), setPowerType(), SetUnitFlag(), SPELL_EFFECT_SUMMON, sSpellMgr, SUMMON_TYPE_MINIPET, ToPet(), Object::ToPlayer(), ToTotem(), SummonPropertiesEntry::Type, UNIT_CREATED_BY_SPELL, UNIT_FIELD_BYTES_2, UNIT_FIELD_SUMMON, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_CONTROLLABLE_GUARDIAN.

Referenced by Player::CreatePet(), Spell::EffectCreateTamedPet(), Spell::EffectTameCreature(), Pet::LoadPetFromDB(), Player::RemovePet(), and Player::SummonPet().

◆ SetMinionGUID()

void Unit::SetMinionGUID ( ObjectGuid  guid)
inline

◆ SetModelVisible()

◆ SetModifierValue()

◆ SetNativeDisplayId()

◆ SetNpcFlag()

void Unit::SetNpcFlag ( NPCFlags  flags)
inline
719{ SetFlag(UNIT_NPC_FLAGS, flags); }

References Object::SetFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::InitializeAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::JustReachedHome(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_chesspiece::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), npc_pos_leader_second::npc_pos_leader_secondAI::MovementInform(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::MovementInform(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::MovementInform(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_akama_illidan::PathEndReached(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), Vehicle::RemovePassenger(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_deathstalker_fearleia::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_hyjal_jaina::hyjalJainaAI::Reset(), npc_hyjal_thrall::hyjalThrallAI::Reset(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::Reset(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_akama_illidan::Reset(), npc_akama_shade::Reset(), npc_magister_aledis::Reset(), Vehicle::Reset(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::ResetData(), NPCStaveQuestAI::ResetState(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), Vehicle::Vehicle(), npc_arthas::npc_arthasAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_general_andorov::WaypointReached(), and npc_cork_gizelton::npc_cork_gizeltonAI::WaypointReached().

◆ SetOwnerGUID()

void Unit::SetOwnerGUID ( ObjectGuid  owner)
10669{
10670 if (GetOwnerGUID() == owner)
10671 return;
10672
10674 if (!owner)
10675 return;
10676
10677 m_applyResilience = !IsVehicle() && owner.IsPlayer();
10678
10679 // Update owner dependent fields
10680 Player* player = ObjectAccessor::GetPlayer(*this, owner);
10681 if (!player || !player->HaveAtClient(this)) // if player cannot see this unit yet, he will receive needed data with create object
10682 return;
10683
10685
10686 UpdateData udata;
10687 WorldPacket packet;
10688 BuildValuesUpdateBlockForPlayer(&udata, player);
10689 udata.BuildPacket(packet);
10690 player->SendDirectMessage(&packet);
10691
10693}
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition: Object.cpp:246
void RemoveFieldNotifyFlag(uint16 flag)
Definition: Object.h:196
void SetFieldNotifyFlag(uint16 flag)
Definition: Object.h:195
Definition: UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition: UpdateData.cpp:48
bool HaveAtClient(WorldObject const *u) const
Definition: Player.cpp:11448

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), GetOwnerGUID(), ObjectAccessor::GetPlayer(), Player::HaveAtClient(), ObjectGuid::IsPlayer(), IsVehicle(), m_applyResilience, Object::RemoveFieldNotifyFlag(), Player::SendDirectMessage(), Object::SetFieldNotifyFlag(), Object::SetGuidValue(), UF_FLAG_OWNER, and UNIT_FIELD_SUMMONEDBY.

Referenced by GameObject::CastSpell(), Spell::EffectSummonType(), boss_illidari_council_memberAI::EnterEvadeMode(), spell_item_draenic_pale_ale::HandleSummon(), npc_pet_gen_fetch_ball::IsSummonedBy(), boss_razorgore::boss_razorgoreAI::JustSummoned(), Player::LoadFromDB(), SetMinion(), and npc_grimstone::npc_grimstoneAI::UpdateEscortAI().

◆ SetPetGUID()

◆ SetPhaseMask()

void Unit::SetPhaseMask ( uint32  newPhaseMask,
bool  update 
)
overridevirtual

Reimplemented from WorldObject.

19147{
19148 if (newPhaseMask == GetPhaseMask())
19149 return;
19150
19151 if (IsInWorld())
19152 {
19153 // xinef: to comment, bellow line should be removed
19154 // pussywizard: goign to other phase (valithria, algalon) should not remove such auras
19155 //RemoveNotOwnSingleTargetAuras(newPhaseMask, true); // we can lost access to caster or target
19156
19157 if (!sScriptMgr->CanSetPhaseMask(this, newPhaseMask, update))
19158 return;
19159
19160 // modify hostile references for new phasemask, some special cases deal with hostile references themselves
19161 if (IsCreature() || (!ToPlayer()->IsGameMaster() && !ToPlayer()->GetSession()->PlayerLogout()))
19162 {
19163 HostileRefMgr& refMgr = getHostileRefMgr();
19164 HostileReference* ref = refMgr.getFirst();
19165
19166 while (ref)
19167 {
19168 if (Unit* unit = ref->GetSource()->GetOwner())
19169 if (Creature* creature = unit->ToCreature())
19170 refMgr.setOnlineOfflineState(creature, creature->InSamePhase(newPhaseMask));
19171
19172 ref = ref->next();
19173 }
19174
19175 // modify threat lists for new phasemask
19176 if (!IsPlayer())
19177 {
19180
19181 // merge expects sorted lists
19182 threatList.sort();
19183 offlineThreatList.sort();
19184 threatList.merge(offlineThreatList);
19185
19186 for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
19187 if (Unit* unit = (*itr)->getTarget())
19188 unit->getHostileRefMgr().setOnlineOfflineState(ToCreature(), unit->InSamePhase(newPhaseMask));
19189 }
19190 }
19191 }
19192
19193 WorldObject::SetPhaseMask(newPhaseMask, false);
19194
19195 if (!IsInWorld())
19196 {
19197 return;
19198 }
19199
19200 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); )
19201 {
19202 Unit* controlled = *itr;
19203 ++itr;
19204 if (controlled->IsCreature())
19205 {
19206 controlled->SetPhaseMask(newPhaseMask, true);
19207 }
19208 }
19209
19210 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
19211 {
19212 if (m_SummonSlot[i])
19213 {
19214 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
19215 {
19216 summon->SetPhaseMask(newPhaseMask, true);
19217 }
19218 }
19219 }
19220
19221 if (update)
19222 {
19224 }
19225}
FROM * GetSource() const
Definition: Reference.h:97
Definition: HostileRefMgr.h:31
void setOnlineOfflineState(bool isOnline)
Definition: HostileRefMgr.cpp:98
HostileReference * getFirst()
Definition: HostileRefMgr.h:59
HostileReference * next()
Definition: ThreatMgr.h:115
ThreatContainer::StorageType const & GetOfflineThreatList() const
Definition: ThreatMgr.h:274
Unit * GetOwner() const
Definition: ThreatMgr.h:236
virtual void SetPhaseMask(uint32 newPhaseMask, bool update)
Definition: Object.cpp:2866
uint32 GetPhaseMask() const
Definition: Object.h:513
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition: Unit.cpp:19146

References HostileRefMgr::getFirst(), getHostileRefMgr(), WorldObject::GetMap(), ThreatMgr::GetOfflineThreatList(), ThreatMgr::GetOwner(), WorldObject::GetPhaseMask(), Reference< TO, FROM >::GetSource(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::InSamePhase(), Object::IsCreature(), Object::IsInWorld(), Object::IsPlayer(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, HostileReference::next(), HostileRefMgr::setOnlineOfflineState(), WorldObject::SetPhaseMask(), SetPhaseMask(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), and UpdateObjectVisibility().

Referenced by Pet::Create(), Creature::Create(), misc_commandscript::HandleAppearCommand(), modify_commandscript::HandleModifyPhaseCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), spell_wintergrasp_hide_small_elementals_aura::HandlePeriodicDummy(), AuraEffect::HandlePhase(), Battlefield::HideNpc(), boss_volazj::InitializeAI(), boss_zuramat::boss_zuramatAI::JustSummoned(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::JustSummoned(), BattlegroundAB::RemovePlayer(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_twilight_halion::boss_twilight_halionAI::Reset(), Creature::setDeathState(), Player::SetGameMaster(), SetPhaseMask(), Battlefield::ShowNpc(), WorldObject::SummonTrigger(), and npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached().

◆ SetPower()

void Unit::SetPower ( Powers  power,
uint32  val,
bool  withPowerUpdate = true,
bool  fromRegenerate = false 
)
15668{
15669 if (!fromRegenerate && GetPower(power) == val)
15670 return;
15671
15672 uint32 maxPower = GetMaxPower(power);
15673 if (maxPower < val)
15674 val = maxPower;
15675
15676 if (fromRegenerate)
15677 {
15680 }
15681 else
15683
15684 if (withPowerUpdate)
15685 {
15686 WorldPacket data(SMSG_POWER_UPDATE, 8 + 1 + 4);
15687 data << GetPackGUID();
15688 data << uint8(power);
15689 data << uint32(val);
15690 SendMessageToSet(&data, IsPlayer());
15691 }
15692
15693 // group update
15694 if (IsPlayer())
15695 {
15696 Player* player = ToPlayer();
15697 if (getPowerType() == power && player->NeedSendSpectatorData())
15698 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15699
15700 if (player->GetGroup())
15702 }
15703 else if (Pet* pet = ToCreature()->ToPet())
15704 {
15705 if (pet->isControlled())
15706 {
15707 Unit* owner = GetOwner();
15708 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15710 }
15711
15712 // Update the pet's character sheet with happiness damage bonus
15713 if (pet->getPetType() == HUNTER_PET && power == POWER_HAPPINESS)
15714 pet->UpdateDamagePhysical(BASE_ATTACK);
15715 }
15716}
@ GROUP_UPDATE_FLAG_PET_CUR_POWER
Definition: Group.h:116
@ GROUP_UPDATE_FLAG_CUR_POWER
Definition: Group.h:104
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition: Util.h:619
@ SMSG_POWER_UPDATE
Definition: Opcodes.h:1182
void UpdateUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:652
void AddToObjectUpdateIfNeeded()
Definition: Object.cpp:513

References Object::AddToObjectUpdateIfNeeded(), AsUnderlyingType(), BASE_ATTACK, WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), Object::GetPackGUID(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_CUR_POWER, GROUP_UPDATE_FLAG_PET_CUR_POWER, HUNTER_PET, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_HAPPINESS, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), WorldObject::SendMessageToSet(), Player::SetGroupUpdateFlag(), Object::SetStatInt32Value(), SMSG_POWER_UPDATE, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_POWER1, and Object::UpdateUInt32Value().

Referenced by Player::ActivateSpec(), Player::Create(), Pet::CreateBaseAtTamed(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), WorldSession::HandlePetAbandon(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), boss_shade_of_aran::OnPowerUpdate(), Player::ProcessDelayedOperations(), Player::Regenerate(), spell_igb_incinerating_blast::RemoveEnergy(), spell_igb_below_zero::RemovePassengers(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_selin_fireheart::Reset(), boss_moam::Reset(), npc_obsidian_destroyer::Reset(), npc_obsidian_eradicator::Reset(), npc_obsidian_nullifier::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::RestoreManaAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetMaxPower(), setPowerType(), Player::SummonPet(), and npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI().

◆ setPowerType()

void Unit::setPowerType ( Powers  power)
10050{
10051 SetByteValue(UNIT_FIELD_BYTES_0, 3, new_powertype);
10052
10053 if (IsPlayer())
10054 {
10055 if (ToPlayer()->GetGroup())
10057 }
10058 else if (Pet* pet = ToCreature()->ToPet())
10059 {
10060 if (pet->isControlled())
10061 {
10062 Unit* owner = GetOwner();
10063 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
10065 }
10066 }
10067
10068 float powerMultiplier = 1.0f;
10069 if (!IsPet())
10070 if (Creature* creature = ToCreature())
10071 powerMultiplier = creature->GetCreatureTemplate()->ModMana;
10072
10073 switch (new_powertype)
10074 {
10075 default:
10076 case POWER_MANA:
10077 break;
10078 case POWER_RAGE:
10079 SetMaxPower(POWER_RAGE, uint32(std::ceil(GetCreatePowers(POWER_RAGE) * powerMultiplier)));
10080 SetPower(POWER_RAGE, 0);
10081 break;
10082 case POWER_FOCUS:
10083 SetMaxPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10084 SetPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10085 break;
10086 case POWER_ENERGY:
10087 SetMaxPower(POWER_ENERGY, uint32(std::ceil(GetCreatePowers(POWER_ENERGY) * powerMultiplier)));
10088 break;
10089 case POWER_HAPPINESS:
10090 SetMaxPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10091 SetPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10092 break;
10093 }
10094
10095 if (Player const* player = ToPlayer())
10096 if (player->NeedSendSpectatorData())
10097 {
10098 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PWT", new_powertype);
10099 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetMaxPower(new_powertype) / 10 : GetMaxPower(new_powertype));
10100 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetPower(new_powertype) / 10 : GetPower(new_powertype));
10101 }
10102}
@ GROUP_UPDATE_FLAG_POWER_TYPE
Definition: Group.h:103
@ GROUP_UPDATE_FLAG_PET_POWER_TYPE
Definition: Group.h:115
void SetMaxPower(Powers power, uint32 val)
Definition: Unit.cpp:15718

References WorldObject::FindMap(), GetCreatePowers(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), GetPower(), GROUP_UPDATE_FLAG_PET_POWER_TYPE, GROUP_UPDATE_FLAG_POWER_TYPE, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Object::SetByteValue(), Player::SetGroupUpdateFlag(), SetMaxPower(), SetPower(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_BYTES_0.

Referenced by Pet::CreateBaseAtTamed(), AuraEffect::HandleAuraModShapeshift(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitDataForForm(), Vehicle::Install(), Pet::LoadPetFromDB(), npc_toc_rogue::npc_toc_rogueAI::npc_toc_rogueAI(), SetMinion(), and Player::SummonPet().

◆ SetPvP()

◆ setRace()

void Unit::setRace ( uint8  race)
20880{
20881 if (IsPlayer())
20882 m_race = race;
20883}

References Object::IsPlayer(), and m_race.

◆ SetRedirectThreat()

void Unit::SetRedirectThreat ( ObjectGuid  guid,
uint32  pct 
)
inline
907{ _redirectThreatInfo.Set(guid, pct); }
void Set(ObjectGuid guid, uint32 pct)
Definition: ThreatMgr.h:301

References _redirectThreatInfo, and RedirectThreatInfo::Set().

Referenced by Spell::EffectRedirectThreat(), and ResetRedirectThreat().

◆ SetResistance()

◆ SetResistanceBuffMods()

void Unit::SetResistanceBuffMods ( SpellSchools  school,
bool  positive,
float  val 
)
inline

◆ SetRooted()

void Unit::SetRooted ( bool  apply,
bool  isStun = false 
)
protected
18302{
18303 if (apply)
18304 {
18305 if (m_rootTimes > 0) // blizzard internal check?
18306 m_rootTimes++;
18307
18308 // MOVEMENTFLAG_ROOT cannot be used in conjunction with MOVEMENTFLAG_MASK_MOVING (tested 3.3.5a)
18309 // this will freeze clients. That's why we remove MOVEMENTFLAG_MASK_MOVING before
18310 // setting MOVEMENTFLAG_ROOT
18312
18313 if (IsFalling())
18314 {
18316 }
18317 else
18318 {
18320 }
18321
18322 // Creature specific
18323 if (!IsPlayer())
18324 {
18325 if (isStun && movespline->Finalized())
18326 {
18328 }
18329 else
18330 {
18331 StopMoving();
18332 }
18333 }
18334
18335 if (m_movedByPlayer)
18336 {
18337 WorldPacket data(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4);
18338 data << GetPackGUID();
18339 data << m_rootTimes;
18341 }
18342 else
18343 {
18345 data << GetPackGUID();
18346 SendMessageToSet(&data, true);
18347 }
18348 }
18349 else
18350 {
18352
18353 if (!HasUnitState(UNIT_STATE_STUNNED)) // prevent moving if it also has stun effect
18354 {
18355 if (m_movedByPlayer)
18356 {
18358 data << GetPackGUID();
18359 data << m_rootTimes;
18361 }
18362 else
18363 {
18365 data << GetPackGUID();
18366 SendMessageToSet(&data, true);
18367 }
18368 }
18369 }
18370}
@ MOVEMENTFLAG_PENDING_ROOT
Definition: UnitDefines.h:387
@ SMSG_FORCE_MOVE_UNROOT
Definition: Opcodes.h:264
@ SMSG_FORCE_MOVE_ROOT
Definition: Opcodes.h:262
@ SMSG_SPLINE_MOVE_ROOT
Definition: Opcodes.h:824
void StopMovingOnCurrentPos()
Definition: Unit.cpp:16772

References AddUnitMovementFlag(), Movement::MoveSpline::Finalized(), Object::GetPackGUID(), HasUnitState(), IsFalling(), Object::IsPlayer(), m_movedByPlayer, m_rootTimes, MOVEMENTFLAG_MASK_MOVING, MOVEMENTFLAG_PENDING_ROOT, MOVEMENTFLAG_ROOT, movespline, RemoveUnitMovementFlag(), Player::SendDirectMessage(), WorldObject::SendMessageToSet(), SMSG_FORCE_MOVE_ROOT, SMSG_FORCE_MOVE_UNROOT, SMSG_SPLINE_MOVE_ROOT, SMSG_SPLINE_MOVE_UNROOT, StopMoving(), StopMovingOnCurrentPos(), Object::ToPlayer(), and UNIT_STATE_STUNNED.

Referenced by WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), SetControlled(), and SetStunned().

◆ SetShapeshiftForm()

void Unit::SetShapeshiftForm ( ShapeshiftForm  form)
21122{
21124 sScriptMgr->OnUnitSetShapeshiftForm((Unit*)this, form);
21125}

References Object::SetByteValue(), sScriptMgr, and UNIT_FIELD_BYTES_2.

Referenced by AuraEffect::HandleAuraModShapeshift(), and reset_commandscript::HandleResetStatsOrLevelHelper().

◆ SetSheath()

◆ SetSpeed()

void Unit::SetSpeed ( UnitMoveType  mtype,
float  rate,
bool  forced = false 
)
14531{
14532 if (rate < 0)
14533 rate = 0.0f;
14534
14535 // Update speed only on change
14536 if (m_speed_rate[mtype] == rate)
14537 return;
14538
14539 m_speed_rate[mtype] = rate;
14540
14542
14543 WorldPacket data;
14544 if (!forced)
14545 {
14546 switch (mtype)
14547 {
14548 case MOVE_WALK:
14549 data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14550 break;
14551 case MOVE_RUN:
14552 data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14553 break;
14554 case MOVE_RUN_BACK:
14555 data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14556 break;
14557 case MOVE_SWIM:
14558 data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14559 break;
14560 case MOVE_SWIM_BACK:
14561 data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14562 break;
14563 case MOVE_TURN_RATE:
14564 data.Initialize(MSG_MOVE_SET_TURN_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14565 break;
14566 case MOVE_FLIGHT:
14567 data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14568 break;
14569 case MOVE_FLIGHT_BACK:
14570 data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14571 break;
14572 case MOVE_PITCH_RATE:
14573 data.Initialize(MSG_MOVE_SET_PITCH_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14574 break;
14575 default:
14576 LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype);
14577 return;
14578 }
14579
14580 data << GetPackGUID();
14581 BuildMovementPacket(&data);
14582 data << float(GetSpeed(mtype));
14583 SendMessageToSet(&data, true);
14584 }
14585 else
14586 {
14587 if (IsPlayer())
14588 {
14589 // register forced speed changes for WorldSession::HandleForceSpeedChangeAck
14590 // and do it only for real sent packets and use run for run/mounted as client expected
14591 ++ToPlayer()->m_forced_speed_changes[mtype];
14592
14593 // Xinef: update speed of pet also
14594 if (!IsInCombat())
14595 {
14596 Unit* pet = ToPlayer()->GetPet();
14597 if (!pet)
14598 pet = GetCharm();
14599
14600 // xinef: do not affect vehicles and possesed pets
14601 if (pet && (pet->HasUnitFlag(UNIT_FLAG_POSSESSED) || pet->IsVehicle()))
14602 pet = nullptr;
14603
14604 if (pet && pet->IsCreature() && !pet->IsInCombat() && pet->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE)
14605 pet->UpdateSpeed(mtype, forced);
14606 if (Unit* critter = ObjectAccessor::GetUnit(*this, GetCritterGUID()))
14607 critter->UpdateSpeed(mtype, forced);
14608 }
14609 ToPlayer()->SetCanTeleport(true);
14610 }
14611
14612 switch (mtype)
14613 {
14614 case MOVE_WALK:
14616 break;
14617 case MOVE_RUN:
14619 break;
14620 case MOVE_RUN_BACK:
14622 break;
14623 case MOVE_SWIM:
14625 break;
14626 case MOVE_SWIM_BACK:
14628 break;
14629 case MOVE_TURN_RATE:
14631 break;
14632 case MOVE_FLIGHT:
14634 break;
14635 case MOVE_FLIGHT_BACK:
14637 break;
14638 case MOVE_PITCH_RATE:
14640 break;
14641 default:
14642 LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype);
14643 return;
14644 }
14645 data << GetPackGUID();
14646 data << (uint32)0; // moveEvent, NUM_PMOVE_EVTS = 0x39
14647 if (mtype == MOVE_RUN)
14648 data << uint8(0); // new 2.1.0
14649 data << float(GetSpeed(mtype));
14650 SendMessageToSet(&data, true);
14651 }
14652}
@ FOLLOW_MOTION_TYPE
Definition: MotionMaster.h:54
@ MOVE_TURN_RATE
Definition: UnitDefines.h:356
@ MOVE_FLIGHT_BACK
Definition: UnitDefines.h:358
@ MOVE_SWIM_BACK
Definition: UnitDefines.h:355
@ MOVE_PITCH_RATE
Definition: UnitDefines.h:359
@ MOVE_RUN_BACK
Definition: UnitDefines.h:353
@ MOVE_WALK
Definition: UnitDefines.h:351
@ SMSG_FORCE_TURN_RATE_CHANGE
Definition: Opcodes.h:764
@ MSG_MOVE_SET_SWIM_BACK_SPEED
Definition: Opcodes.h:243
@ MSG_MOVE_SET_TURN_RATE
Definition: Opcodes.h:246
@ SMSG_FORCE_WALK_SPEED_CHANGE
Definition: Opcodes.h:760
@ SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE
Definition: Opcodes.h:929
@ MSG_MOVE_SET_PITCH_RATE
Definition: Opcodes.h:1145
@ SMSG_FORCE_RUN_SPEED_CHANGE
Definition: Opcodes.h:256
@ SMSG_FORCE_SWIM_BACK_SPEED_CHANGE
Definition: Opcodes.h:762
@ SMSG_FORCE_RUN_BACK_SPEED_CHANGE
Definition: Opcodes.h:258
@ SMSG_FORCE_FLIGHT_SPEED_CHANGE
Definition: Opcodes.h:927
@ SMSG_FORCE_SWIM_SPEED_CHANGE
Definition: Opcodes.h:260
@ MSG_MOVE_SET_RUN_SPEED
Definition: Opcodes.h:235
@ MSG_MOVE_SET_FLIGHT_SPEED
Definition: Opcodes.h:924
@ MSG_MOVE_SET_WALK_SPEED
Definition: Opcodes.h:239
@ MSG_MOVE_SET_SWIM_SPEED
Definition: Opcodes.h:241
@ MSG_MOVE_SET_FLIGHT_BACK_SPEED
Definition: Opcodes.h:926
@ SMSG_FORCE_PITCH_RATE_CHANGE
Definition: Opcodes.h:1146
@ MSG_MOVE_SET_RUN_BACK_SPEED
Definition: Opcodes.h:237
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition: Player.h:2403
float GetSpeed(UnitMoveType mtype) const
Definition: Unit.cpp:14525
void propagateSpeedChange()
Definition: Unit.h:1661
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition: MotionMaster.cpp:948

References BuildMovementPacket(), FOLLOW_MOTION_TYPE, GetCharm(), GetCritterGUID(), MotionMaster::GetCurrentMovementGeneratorType(), GetMotionMaster(), Object::GetPackGUID(), Player::GetPet(), GetSpeed(), ObjectAccessor::GetUnit(), HasUnitFlag(), WorldPacket::Initialize(), Object::IsCreature(), IsInCombat(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, Player::m_forced_speed_changes, m_speed_rate, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_PITCH_RATE, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_TURN_RATE, MOVE_WALK, MSG_MOVE_SET_FLIGHT_BACK_SPEED, MSG_MOVE_SET_FLIGHT_SPEED, MSG_MOVE_SET_PITCH_RATE, MSG_MOVE_SET_RUN_BACK_SPEED, MSG_MOVE_SET_RUN_SPEED, MSG_MOVE_SET_SWIM_BACK_SPEED, MSG_MOVE_SET_SWIM_SPEED, MSG_MOVE_SET_TURN_RATE, MSG_MOVE_SET_WALK_SPEED, propagateSpeedChange(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, SMSG_FORCE_FLIGHT_SPEED_CHANGE, SMSG_FORCE_PITCH_RATE_CHANGE, SMSG_FORCE_RUN_BACK_SPEED_CHANGE, SMSG_FORCE_RUN_SPEED_CHANGE, SMSG_FORCE_SWIM_BACK_SPEED_CHANGE, SMSG_FORCE_SWIM_SPEED_CHANGE, SMSG_FORCE_TURN_RATE_CHANGE, SMSG_FORCE_WALK_SPEED_CHANGE, Object::ToPlayer(), UNIT_FLAG_POSSESSED, and UpdateSpeed().

Referenced by Battleground::AddCreature(), boss_bug_trio::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_volkhan::boss_volkhanAI::GoToAnvil(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), WorldSession::HandleForceSpeedChangeAck(), modify_commandscript::HandleModifyASpeedCommand(), modify_commandscript::HandleModifyMountCommand(), Creature::InitEntry(), boss_glob_of_viscidus::InitializeAI(), Guardian::InitStatsForLevel(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), boss_sartharion_dragonAI::JustEngagedWith(), boss_four_horsemen::boss_four_horsemenAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), boss_onyxia::MovementInform(), boss_bug_trio::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_akilzon_eagle::MovementInform(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_batrider::npc_batrider(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), SmartScript::ProcessAction(), boss_nightbane::Reset(), npc_zuljin_vortex::Reset(), boss_headless_horseman::Reset(), boss_onyxia::Reset(), boss_bug_trio::Reset(), boss_sartharion_dragonAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_volkhan::boss_volkhanAI::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), npc_wild_wyrm::npc_wild_wyrmAI::Reset(), npc_freed_protodrake::npc_freed_protodrakeAI::Reset(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), npc_eastvale_peasent::SetData(), Battlefield::SpawnCreature(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), npc_akilzon_eagle::UpdateAI(), boss_onyxia::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), UpdateSpeed(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetSpeedRate()

◆ SetStandFlags()

◆ SetStandState()

void Unit::SetStandState ( uint8  state)
16810{
16812
16813 if (IsStandState())
16815
16816 if (IsPlayer())
16817 {
16819 data << (uint8)state;
16820 ToPlayer()->GetSession()->SendPacket(&data);
16821 }
16822}
@ UNIT_BYTES_1_OFFSET_STAND_STATE
Definition: UnitDefines.h:23
@ SMSG_STANDSTATE_UPDATE
Definition: Opcodes.h:699

References AURA_INTERRUPT_FLAG_NOT_SEATED, Player::GetSession(), Object::IsPlayer(), IsStandState(), RemoveAurasWithInterruptFlags(), WorldSession::SendPacket(), Object::SetByteValue(), SMSG_STANDSTATE_UPDATE, Object::ToPlayer(), UNIT_BYTES_1_OFFSET_STAND_STATE, and UNIT_FIELD_BYTES_1.

Referenced by _ApplyAura(), boss_kologarn::boss_kologarnAI::boss_kologarnAI(), boss_twinemperorsAI::boss_twinemperorsAI(), boss_thekal::CheckPhaseTransition(), npc_ringo::npc_ringoAI::ClearFaint(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), CombatStart(), npc_vrykul_skeleton::DamageTaken(), boss_alar::DamageTaken(), boss_thekal::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_nightbane::DoAction(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_the_lurker_below::DoAction(), boss_leotheras_the_blind::DoAction(), npc_madrigosa::DoAction(), boss_illidan_stormrage::DoAction(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), Spell::DoAllEffectOnTarget(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_ahune::Emerge(), UtherBatteredHiltEvent::Execute(), SuckBackEvent::Execute(), boss_ahune::ExecuteEvent(), boss_ingvar_the_plunderer::FeignDeath(), WorldSession::HandleAlterAppearance(), WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMovementOpcodes(), WorldSession::HandlePlayerLoginFromDB(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStandStateChangeOpcode(), spell_q11322_q11317_the_cleansing::if(), DistractMovementGenerator::Initialize(), boss_felmyst::InitializeAI(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), boss_kalecgos::JustEngagedWith(), boss_palehoof::boss_palehoofAI::JustReachedHome(), npc_massive_jormungar::npc_massive_jormungarAI::JustReachedHome(), npc_ferocious_rhino::npc_ferocious_rhinoAI::JustReachedHome(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::JustReachedHome(), npc_frenzied_worgen::npc_frenzied_worgenAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_kologarn::boss_kologarnAI::MoveInLineOfSight(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::MoveInLineOfSight(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_twilight_volunteer::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), npc_madrigosa::npc_madrigosa(), spell_love_is_in_the_air_romantic_picnic::OnApply(), boss_shade_of_aran::OnPowerUpdate(), npc_kernobee::OnQuestAccept(), npc_kerlonian::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_ringo::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_bonker_togglevolt::OnQuestAccept(), spell_q12937_relief_for_the_fallen::OnRemove(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), Spell::prepare(), PretendToDie(), boss_alar::PretendToDie(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_kalecgos::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_thekal::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Reset(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::Reset(), boss_illidan_stormrage::Reset(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), Resurrect(), boss_the_lurker_below::SchedulerPhaseOne(), boss_the_lurker_below::SchedulerPhaseTwo(), npc_ringo::npc_ringoAI::SetFaint(), npc_kurenai_captive::npc_kurenai_captiveAI::SetGUID(), SetInCombatState(), npc_kerlonian::npc_kerlonianAI::SetSleeping(), SetStunned(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), advisor_baseAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), boss_felmyst::StartIntro(), boss_ahune::Submerge(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_corporal_keeshan::npc_corporal_keeshanAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_tallhorn_stag::npc_tallhorn_stagAI::UpdateAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), GameObject::Use(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetStat()

void Unit::SetStat ( Stats  stat,
int32  val 
)
inline

◆ SetStunned()

void Unit::SetStunned ( bool  apply)
protected
18254{
18256 {
18257 return;
18258 }
18259
18260 if (apply)
18261 {
18262 SetTarget();
18264
18265 if (IsPlayer())
18266 {
18268 }
18269
18270 SetRooted(true, true);
18271
18272 CastStop();
18273 }
18274 else
18275 {
18276 if (IsAlive() && GetVictim())
18278
18279 if (IsCreature())
18280 {
18281 // don't remove UNIT_FLAG_STUNNED for pet when owner is mounted (disabled pet's interface)
18282 Unit* owner = GetOwner();
18283 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18285
18286 // Xinef: same for charmed npcs
18287 owner = GetCharmer();
18288 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18290 }
18291 else
18293
18294 if (!HasUnitState(UNIT_STATE_ROOT)) // prevent moving if it also has root effect
18295 {
18296 SetRooted(false, true);
18297 }
18298 }
18299}

References CastStop(), GetCharmer(), Object::GetGUID(), GetOwner(), GetVictim(), HasUnitState(), IsAlive(), Object::IsCreature(), IsMounted(), Object::IsPlayer(), RemoveUnitFlag(), SetRooted(), SetStandState(), SetTarget(), SetUnitFlag(), Object::ToPlayer(), UNIT_FLAG_STUNNED, UNIT_STAND_STATE_STAND, UNIT_STATE_IN_FLIGHT, and UNIT_STATE_ROOT.

Referenced by SetControlled().

◆ SetSwim()

bool Unit::SetSwim ( bool  enable)
virtual

◆ SetTarget()

virtual void Unit::SetTarget ( ObjectGuid  = ObjectGuid::Empty)
pure virtual

◆ SetTimedFacingToObject()

void Unit::SetTimedFacingToObject ( WorldObject object,
uint32  time 
)
Todo:
figure out under what conditions creature will move towards object instead of facing it where it currently is.
20393{
20394 // never face when already moving
20395 if (!IsStopped() || !time)
20396 return;
20397
20399 Movement::MoveSplineInit init(this);
20400 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
20401 init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming
20402 init.Launch();
20403
20404 if (Creature* c = ToCreature())
20405 c->m_Events.AddEvent(new ResetToHomeOrientation(*c), c->m_Events.CalculateTime(time));
20406 else
20407 LOG_ERROR("entities.unit", "Unit::SetTimedFacingToObject called on non-creature unit {}. This should never happen.", GetEntry());
20408}
Definition: Unit.cpp:20137

References Position::GetAngle(), Object::GetEntry(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsStopped(), Movement::MoveSplineInit::Launch(), LOG_ERROR, Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and Object::ToCreature().

Referenced by spell_chapter5_return_to_capital::HandleHit().

◆ setTransForm()

void Unit::setTransForm ( uint32  spellid)
inline
1883{ m_transform = spellid;}

References m_transform.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetUInt32Value()

void Unit::SetUInt32Value ( uint16  index,
uint32  value 
)
21183{
21184 Object::SetUInt32Value(index, value);
21185
21186 switch (index)
21187 {
21188 // Invalidating the cache on health change should fix an issue where the client sees dead NPCs when they are not.
21189 // We might also need to invalidate the cache for some other fields as well.
21190 case UNIT_FIELD_HEALTH:
21192 break;
21193 }
21194}
void SetUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:639
void InvalidateValuesUpdateCache()
Definition: Unit.h:2143

References InvalidateValuesUpdateCache(), Object::SetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_LoadDailyQuestStatus(), Player::_LoadSkills(), Player::AddItemToBuyBackSlot(), Attack(), Player::CheckAreaExploreAndOutdoor(), Spell::CheckItems(), Player::Create(), Pet::CreateBaseAtTamed(), Player::CreatePet(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), Dismount(), npc_harrison_jones::DoAction(), boss_thekal::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_pathaleon_the_calculator::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_illidan_stormrage::DoAction(), Player::DuelComplete(), Spell::EffectSummonPet(), Spell::EffectTameCreature(), boss_jindo::EnterEvadeMode(), boss_zuljin::EnterPhase(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraTransform(), character_commandscript::HandleCharacterLevel(), debug_commandscript::HandleDebugMod32ValueCommand(), debug_commandscript::HandleDebugUpdateCommand(), spell_dk_dancing_rune_weapon_visual::HandleEffectApply(), spell_gen_model_visible::HandleEffectApply(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_baby_murloc::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), misc_commandscript::HandleHideAreaCommand(), modify_commandscript::HandleModifyStandStateCommand(), modify_commandscript::HandleMorphMountCommand(), WorldSession::HandleMovementOpcodes(), AuraEffect::HandleNoReagentUseAura(), npc_commandscript::HandleNpcPlayEmoteCommand(), WorldSession::HandlePetRename(), reset_commandscript::HandleResetHonorCommand(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), WorldSession::HandleSelfResOpcode(), WorldSession::HandleSetTitleOpcode(), WorldSession::HandleSetWatchedFactionOpcode(), misc_commandscript::HandleShowAreaCommand(), WorldSession::HandleTextEmoteOpcode(), titles_commandscript::HandleTitlesCurrentCommand(), titles_commandscript::HandleTitlesRemoveCommand(), titles_commandscript::HandleTitlesSetMaskCommand(), Player::InitGlyphsForLevel(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Initialize(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), InitTamedPet(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustDied(), boss_xt002::boss_xt002AI::JustEngagedWith(), npc_dragonflayer_forge_master::JustEngagedWith(), boss_jindo::JustEngagedWith(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Kill(), Creature::LoadCreaturesAddon(), Creature::LoadEquipment(), Player::LoadFromDB(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), Player::ModifySkillBonus(), Mount(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_harrison_jones::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), npc_tirion_fordring_tft::npc_tirion_fordringAI::MovementInform(), npc_akama_illidan::MovementInform(), npc_thassarian2::npc_thassarian2AI::MovementInform(), npc_apothecary_genericAI::MovementInform(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::npc_pos_martin_or_gorkun_secondAI(), spell_gen_clone_weapon_aura::OnApply(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_ame::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), spell_gen_clone_weapon_aura::OnRemove(), npc_eastvale_peasent::PathEndReached(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), Player::RemoveAmmo(), Player::RemoveItemFromBuyBackSlot(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), ReplaceAllDynamicFlags(), ReplaceAllNpcFlags(), Player::ReplaceAllPlayerFlags(), ReplaceAllUnitFlags(), ReplaceAllUnitFlags2(), boss_ragnaros::boss_ragnarosAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_zuljin::Reset(), boss_arlokk::boss_arlokkAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), npc_hor_leader::npc_hor_leaderAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_amberpine_woodsman::npc_amberpine_woodsmanAI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetDailyQuestStatus(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), Spell::SendChannelStart(), Spell::SendChannelUpdate(), Player::SetAmmo(), Player::SetArenaPoints(), Player::SetArenaTeamInfoField(), SetCharmedBy(), SetCreateHealth(), SetCreateMana(), Player::SetCurrentTitle(), Player::SetDailyQuestStatus(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), npc_eastvale_peasent::SetData(), setDeathState(), SetDisplayId(), SetEmoteState(), SetFaction(), Player::SetFreePrimaryProfessions(), Player::SetFreeTalentPoints(), Player::SetGlyph(), Player::SetGlyphSlot(), SetHealth(), Player::SetHonorPoints(), Player::SetInGuild(), SetLevel(), SetMaxHealth(), Player::SetMoney(), SetNativeDisplayId(), CharmInfo::SetPetNumber(), Player::SetQuestSlot(), Player::SetQuestSlotTimer(), Player::SetRank(), Player::SetRestBonus(), Player::SetSkill(), SetVirtualItem(), Player::SetVisibleItemSlot(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Map::SummonCreature(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), Player::SummonPet(), Player::SwapQuestSlot(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_amberpine_woodsman::npc_amberpine_woodsmanAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), Player::UpdateArmorPenetration(), Player::UpdateDuelFlag(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), Player::UpdateExpertise(), Player::UpdateHonorFields(), Player::UpdateRating(), Player::UpdateShieldBlockValue(), Player::UpdateSkill(), Player::UpdateSkillPro(), Player::UpdateSkillsForLevel(), Player::UpdateSkillsToMaxSkillsForLevel(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), and npc_ranger_lilatha::WaypointReached().

◆ SetUnitFlag()

void Unit::SetUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

703{ SetFlag(UNIT_FIELD_FLAGS, flags); }

References Object::SetFlag(), and UNIT_FIELD_FLAGS.

Referenced by BattlegroundAV::AddAVCreature(), Vehicle::AddPassenger(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::AddPortals(), Creature::AllLootRemovedFromCorpse(), npc_doctor::npc_doctorAI::BeginEvent(), boss_jarien::boss_jarien(), boss_sothos::boss_sothos(), GameObject::CastSpell(), Player::Create(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_muru::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), advisor_baseAI::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Deactivate(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_amanishi_lookout::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), boss_kalecgos::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_illidan_stormrage::DoAction(), PetAI::DoAttack(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_erekem::boss_erekemAI::EnterEvadeMode(), boss_ichoron::boss_ichoronAI::EnterEvadeMode(), boss_lavanthor::boss_lavanthorAI::EnterEvadeMode(), boss_moragg::boss_moraggAI::EnterEvadeMode(), boss_xevozz::boss_xevozzAI::EnterEvadeMode(), boss_zuramat::boss_zuramatAI::EnterEvadeMode(), boss_anubarak_trial::boss_anubarak_trialAI::EnterEvadeMode(), boss_jaraxxus::boss_jaraxxusAI::EnterEvadeMode(), boss_gormok::boss_gormokAI::EnterEvadeMode(), boss_jormungarAI::EnterEvadeMode(), boss_icehowl::boss_icehowlAI::EnterEvadeMode(), SACDeactivateEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), boss_ingvar_the_plunderer::FeignDeath(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_gen_model_visible::HandleEffectApply(), spell_gen_feign_death_all_flags::HandleEffectApply(), spell_gen_feign_death_no_dyn_flag::HandleEffectApply(), spell_gen_feign_death_no_prevent_emotes::HandleEffectApply(), AuraEffect::HandleFeignDeath(), spell_chapter2_persuasive_strike::HandleHit(), BattlefieldWG::HandleKill(), Battleground::HandleKillPlayer(), WorldSession::HandleLogoutRequestOpcode(), spell_oculus_rider_aura::HandleOnEffectApply(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_malchezaar_axe::Initialize(), npc_captured_beryl_sorcerer::npc_captured_beryl_sorcererAI::Initialize(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::InitializeAI(), boss_kiljaeden::InitializeAI(), npc_general_andorov::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), Player::InitStatsForLevel(), boss_kologarn::boss_kologarnAI::JustDied(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_gothik::boss_gothikAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_hazzarah::JustSummoned(), boss_vaelastrasz::boss_vaelAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Mount(), npc_shattered_hand_scout::MoveInLineOfSight(), boss_kaelthas::MoveInLineOfSight(), npc_batrider::npc_batrider(), npc_blade_of_azzinoth::npc_blade_of_azzinoth(), npc_chess_move_trigger::npc_chess_move_trigger(), npc_hol_monument::npc_hol_monumentAI::npc_hol_monumentAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_q24545_vegard::npc_q24545_vegardAI::npc_q24545_vegardAI(), npc_xt002_heart::npc_xt002_heartAI::npc_xt002_heartAI(), spell_halion_twilight_phasing_aura::OnApply(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), Creature::RefreshSwimmingFlag(), boss_keristrasza::RemovePrison(), npc_grimstone::npc_grimstoneAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_nefarian::Reset(), boss_nightbane::Reset(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_kiljaeden::Reset(), npc_zuljin_vortex::Reset(), npc_hallows_end_soh::Reset(), npc_ancient_wisp::Reset(), boss_cthun::Reset(), npc_depth_charge::npc_depth_chargeAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_death_ravager::npc_death_ravagerAI::Reset(), npc_giant_spotlight::npc_giant_spotlightAI::Reset(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::Reset(), boss_jedoga_shadowseeker::Reset(), boss_anub_arak::boss_anub_arakAI::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_announcer_toc5::npc_announcer_toc5AI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_novos::boss_novosAI::Reset(), boss_tyrannus::boss_tyrannusAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_malygos::boss_malygosAI::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_massive_jormungar::npc_massive_jormungarAI::Reset(), npc_ferocious_rhino::npc_ferocious_rhinoAI::Reset(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::Reset(), npc_frenzied_worgen::npc_frenzied_worgenAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), npc_drakuru_shackles::npc_drakuru_shacklesAI::Reset(), boss_shade_of_akama::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), boss_warlord_kalithresh::Reset(), boss_broggok::Reset(), boss_kelidan_the_breaker::Reset(), boss_magtheridon::Reset(), boss_kaelthas::Reset(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_the_lurker_below::SchedulerPhaseOne(), Player::SendLoot(), SetCharm(), SetCharmedBy(), SetImmuneToNPC(), SetImmuneToPC(), SetInCombatState(), Player::SetIsSpectator(), SetMinion(), SetStunned(), SetSwim(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::ShowNpc(), npc_netherspite_infernal::SpellHit(), npc_harrison_jones::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_ionar::boss_ionarAI::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), npc_giant_claw_tentacle::Submerge(), boss_ouro::Submerge(), boss_ahune::Submerge(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_madrigosa::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_blistering_zombie::npc_blistering_zombieAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and Creature::UpdateEntry().

◆ SetUnitFlag2()

◆ SetUnitMovementFlags()

◆ SetVirtualItem()

void Unit::SetVirtualItem ( uint32  slot,
uint32  itemId 
)
21036{
21037 if (slot >= MAX_EQUIPMENT_ITEMS)
21038 return;
21039
21041}

References MAX_EQUIPMENT_ITEMS, SetUInt32Value(), and UNIT_VIRTUAL_ITEM_SLOT_ID.

Referenced by ScriptedAI::SetEquipmentSlots().

◆ SetVisible()

void Unit::SetVisible ( bool  x)
14334{
14335 if (!x)
14337 else
14339
14341}
@ SEC_GAMEMASTER
Definition: Common.h:59

References WorldObject::m_serverSideVisibility, SEC_GAMEMASTER, SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and UpdateObjectVisibility().

Referenced by Creature::Create(), boss_muru::DamageTaken(), boss_alar::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), boss_archimonde::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), HideNpcEvent::Execute(), UtherBatteredHiltEvent::Execute(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), BattlegroundSA::HandleKillUnit(), Battlefield::HideNpc(), boss_kiljaeden::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), npc_xt002_heart::npc_xt002_heartAI::JustDied(), SmartAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_hazzarah::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::MovementInform(), boss_vazruden_the_herald::MovementInform(), npc_shattered_hand_scout::MovementInform(), npc_madrigosa::npc_madrigosa(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::npc_time_lost_proto_drakeAI(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnCreatureCreate(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::OnCreatureCreate(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_pit_of_saron::instance_pit_of_saron_InstanceScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::PassengerBoarded(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_midnight::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_muru::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_archimonde::Reset(), boss_eye_of_cthun::Reset(), npc_murkdeep::npc_murkdeepAI::Reset(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_pos_leader::npc_pos_leaderAI::Reset(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::Reset(), boss_ionar::boss_ionarAI::Reset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::Reset(), npc_minigob_manabonk::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), boss_vazruden_the_herald::Reset(), npc_enslaved_netherwing_drake::Reset(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SetData(), Battlefield::ShowNpc(), boss_ionar::boss_ionarAI::Split(), boss_warchief_kargath_bladefist::SummonedCreatureDies(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), npc_commander_dawnforge::npc_commander_dawnforgeAI::UpdateAI(), SmartAI::UpdateDespawn(), npc_grimstone::npc_grimstoneAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_taretha::npc_tarethaAI::WaypointReached().

◆ SetVisibleAura()

void Unit::SetVisibleAura ( uint8  slot,
AuraApplication aur 
)
inline

◆ SetWalk()

bool Unit::SetWalk ( bool  enable)
virtual

Reimplemented in Creature.

20411{
20412 if (enable == IsWalking())
20413 return false;
20414
20415 if (enable)
20417 else
20419
20421 return true;
20422}

References AddUnitMovementFlag(), IsWalking(), MOVEMENTFLAG_WALKING, propagateSpeedChange(), and RemoveUnitMovementFlag().

Referenced by debug_commandscript::HandleDebugMoveflagsCommand(), SetCharm(), and Creature::SetWalk().

◆ SetWaterWalking()

bool Unit::SetWaterWalking ( bool  enable,
bool  packetOnly = false 
)
virtual

Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players.

Reimplemented in Player, and Creature.

20490{
20492 return false;
20493
20494 if (enable)
20496 else
20498
20499 return true;
20500}
@ MOVEMENTFLAG_WATERWALKING
Definition: UnitDefines.h:395

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_WATERWALKING, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraWaterWalk(), debug_commandscript::HandleDebugMoveflagsCommand(), Player::SetWaterWalking(), and Creature::SetWaterWalking().

◆ SpellBaseDamageBonusDone()

int32 Unit::SpellBaseDamageBonusDone ( SpellSchoolMask  schoolMask)
12030{
12031 int32 DoneAdvertisedBenefit = 0;
12032
12034 for (AuraEffectList::const_iterator i = mDamageDone.begin(); i != mDamageDone.end(); ++i)
12035 if (((*i)->GetMiscValue() & schoolMask) != 0 &&
12036 (*i)->GetSpellInfo()->EquippedItemClass == -1 &&
12037 // -1 == any item class (not wand then)
12038 (*i)->GetSpellInfo()->EquippedItemInventoryTypeMask == 0)
12039 // 0 == any inventory type (not wand then)
12040 DoneAdvertisedBenefit += (*i)->GetAmount();
12041
12042 if (IsPlayer())
12043 {
12044 // Base value
12045 DoneAdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12046 DoneAdvertisedBenefit += ToPlayer()->GetBaseSpellDamageBonus();
12047
12048 // Damage bonus from stats
12050 for (AuraEffectList::const_iterator i = mDamageDoneOfStatPercent.begin(); i != mDamageDoneOfStatPercent.end(); ++i)
12051 {
12052 if ((*i)->GetMiscValue() & schoolMask)
12053 {
12054 // stat used stored in miscValueB for this aura
12055 Stats usedStat = Stats((*i)->GetMiscValueB());
12056 DoneAdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12057 }
12058 }
12059 // ... and attack power
12061 for (AuraEffectList::const_iterator i = mDamageDonebyAP.begin(); i != mDamageDonebyAP.end(); ++i)
12062 if ((*i)->GetMiscValue() & schoolMask)
12063 DoneAdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
12064 }
12065 return DoneAdvertisedBenefit;
12066}
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER
Definition: SpellAuraDefines.h:300
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:237
@ SPELL_AURA_MOD_DAMAGE_DONE
Definition: SpellAuraDefines.h:76
uint32 GetBaseSpellPowerBonus()
Definition: Player.h:1968
uint32 GetBaseSpellDamageBonus()
Definition: Player.h:1969

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellDamageBonus(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::IsPlayer(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by spell_item_wraith_scythe_drain_life::CalculateDamage(), spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), Spell::EffectWeaponDmg(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), SpellDamageBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseDamageBonusTaken()

int32 Unit::SpellBaseDamageBonusTaken ( SpellSchoolMask  schoolMask,
bool  isDoT = false 
)
12069{
12070 int32 TakenAdvertisedBenefit = 0;
12071
12073 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
12074 if (((*i)->GetMiscValue() & schoolMask) != 0)
12075 {
12076 // Xinef: if we have DoT damage type and aura has charges, check if it affects DoTs
12077 // Xinef: required for hemorrhage & rupture / garrote
12078 if (isDoT && (*i)->GetBase()->IsUsingCharges() && !((*i)->GetSpellInfo()->ProcFlags & PROC_FLAG_TAKEN_PERIODIC))
12079 continue;
12080
12081 TakenAdvertisedBenefit += (*i)->GetAmount();
12082 }
12083
12084 return TakenAdvertisedBenefit;
12085}

References GetAuraEffectsByType(), PROC_FLAG_TAKEN_PERIODIC, and SPELL_AURA_MOD_DAMAGE_TAKEN.

Referenced by HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), and SpellDamageBonusTaken().

◆ SpellBaseHealingBonusDone()

int32 Unit::SpellBaseHealingBonusDone ( SpellSchoolMask  schoolMask)
12796{
12797 int32 AdvertisedBenefit = 0;
12798
12800 for (AuraEffectList::const_iterator i = mHealingDone.begin(); i != mHealingDone.end(); ++i)
12801 if (!(*i)->GetMiscValue() || ((*i)->GetMiscValue() & schoolMask) != 0)
12802 AdvertisedBenefit += (*i)->GetAmount();
12803
12804 // Healing bonus of spirit, intellect and strength
12805 if (IsPlayer())
12806 {
12807 // Base value
12808 AdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12809 AdvertisedBenefit += ToPlayer()->GetBaseSpellHealingBonus();
12810
12811 // Healing bonus from stats
12813 for (AuraEffectList::const_iterator i = mHealingDoneOfStatPercent.begin(); i != mHealingDoneOfStatPercent.end(); ++i)
12814 {
12815 // stat used dependent from misc value (stat index)
12816 Stats usedStat = Stats((*i)->GetSpellInfo()->Effects[(*i)->GetEffIndex()].MiscValue);
12817 AdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12818 }
12819
12820 // ... and attack power
12822 for (AuraEffectList::const_iterator i = mHealingDonebyAP.begin(); i != mHealingDonebyAP.end(); ++i)
12823 if ((*i)->GetMiscValue() & schoolMask)
12824 AdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
12825 }
12826 return AdvertisedBenefit;
12827}
@ SPELL_AURA_MOD_HEALING_DONE
Definition: SpellAuraDefines.h:198
@ SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:238
@ SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER
Definition: SpellAuraDefines.h:301
uint32 GetBaseSpellHealingBonus()
Definition: Player.h:1970

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellHealingBonus(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::IsPlayer(), SPELL_AURA_MOD_HEALING_DONE, SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by CalculateSpellAmount(), SpellHealingBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseHealingBonusTaken()

int32 Unit::SpellBaseHealingBonusTaken ( SpellSchoolMask  schoolMask)
12830{
12831 int32 AdvertisedBenefit = 0;
12832
12834 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
12835 if (((*i)->GetMiscValue() & schoolMask) != 0)
12836 AdvertisedBenefit += (*i)->GetAmount();
12837
12838 return AdvertisedBenefit;
12839}
@ SPELL_AURA_MOD_HEALING
Definition: SpellAuraDefines.h:178

References GetAuraEffectsByType(), and SPELL_AURA_MOD_HEALING.

Referenced by SpellHealingBonusTaken().

◆ SpellCriticalDamageBonus()

uint32 Unit::SpellCriticalDamageBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12375{
12376 // Calculate critical bonus
12377 int32 crit_bonus = damage;
12378 float crit_mod = 0.0f;
12379
12380 switch (spellProto->DmgClass)
12381 {
12382 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12385 crit_bonus += damage;
12386 break;
12387 default:
12388 crit_bonus += damage / 2; // for spells is 50%
12389 break;
12390 }
12391
12392 if (caster)
12393 {
12394 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellProto->GetSchoolMask());
12395
12396 if (victim)
12397 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, victim->GetCreatureTypeMask());
12398
12399 if (crit_bonus != 0 && crit_mod != 0.0f)
12400 AddPct(crit_bonus, crit_mod);
12401
12402 crit_bonus -= damage;
12403
12404 // adds additional damage to critBonus (from talents)
12405 if (Player* modOwner = caster->GetSpellModOwner())
12406 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12407
12408 crit_bonus += damage;
12409 }
12410
12411 return crit_bonus;
12412}

References AddPct(), SpellInfo::DmgClass, GetCreatureTypeMask(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellCriticalHealingBonus()

uint32 Unit::SpellCriticalHealingBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12415{
12416 // Calculate critical bonus
12417 int32 crit_bonus;
12418 switch (spellProto->DmgClass)
12419 {
12420 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12423 crit_bonus = damage;
12424 break;
12425 default:
12426 crit_bonus = damage / 2; // for spells is 50%
12427 break;
12428 }
12429
12430 if (caster)
12431 {
12432 if (victim)
12433 {
12434 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
12435 crit_bonus = int32(crit_bonus * caster->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, creatureTypeMask));
12436 }
12437
12438 // adds additional damage to critBonus (from talents)
12439 // xinef: used for death knight death coil
12440 if (Player* modOwner = caster->GetSpellModOwner())
12441 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12442 }
12443
12444 if (crit_bonus > 0)
12445 damage += crit_bonus;
12446
12447 if (caster)
12448 damage = int32(float(damage) * caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT));
12449
12450 return damage;
12451}
@ SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT
Definition: SpellAuraDefines.h:113

References SpellInfo::DmgClass, GetCreatureTypeMask(), GetSpellModOwner(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by Spell::DoAllEffectOnTarget(), and AuraEffect::HandlePeriodicHealAurasTick().

◆ SpellDamageBonusDone()

uint32 Unit::SpellDamageBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
11708{
11709 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11710 return pdamage;
11711
11712 // Some spells don't benefit from done mods
11713 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11714 return pdamage;
11715
11716 // For totems get damage bonus from owner
11717 if (IsCreature())
11718 {
11719 if (IsTotem())
11720 {
11721 if (Unit* owner = GetOwner())
11722 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, effIndex, TotalMod, stack);
11723 }
11724 // Dancing Rune Weapon...
11725 else if (GetEntry() == 27893)
11726 {
11727 if (Unit* owner = GetOwner())
11728 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, TotalMod, stack) / 2;
11729 }
11730 }
11731
11732 // Done total percent damage auras
11733 float ApCoeffMod = 1.0f;
11734 int32 DoneTotal = 0;
11735 float DoneTotalMod = TotalMod ? TotalMod : SpellPctDamageModsDone(victim, spellProto, damagetype);
11736
11737 // Config : RATE_CREATURE_X_SPELLDAMAGE & Do Not Modify Pet/Guardian/Mind Controlled Damage
11739 DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank);
11740
11741 // Some spells don't benefit from pct done mods
11742 if (!spellProto->HasAttribute(SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS))
11743 {
11744 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11745 // Add flat bonus from spell damage versus
11747 }
11748
11749 // done scripted mod (take it from owner)
11750 Unit* owner = GetOwner() ? GetOwner() : this;
11751 int32 DoneAdvertisedBenefit = 0;
11752 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11753 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11754 {
11755 if (!(*i)->IsAffectedOnSpell(spellProto))
11756 continue;
11757
11758 switch ((*i)->GetMiscValue())
11759 {
11760 case 4418: // Increased Shock Damage
11761 case 4554: // Increased Lightning Damage
11762 case 4555: // Improved Moonfire
11763 case 5142: // Increased Lightning Damage
11764 case 5147: // Improved Consecration / Libram of Resurgence
11765 case 5148: // Idol of the Shooting Star
11766 case 6008: // Increased Lightning Damage
11767 case 8627: // Totem of Hex
11768 {
11769 DoneAdvertisedBenefit += (*i)->GetAmount();
11770 break;
11771 }
11772 }
11773 }
11774
11775 // Custom scripted damage
11776 switch (spellProto->SpellFamilyName)
11777 {
11778 case SPELLFAMILY_DRUID:
11779 {
11780 // Insect Swarm vs Item - Druid T8 Balance Relic
11781 if (spellProto->SpellFamilyFlags[0] & 0x00200000)
11782 {
11783 if (AuraEffect const* relicAurEff = GetAuraEffect(64950, EFFECT_0))
11784 {
11785 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11786 }
11787 }
11788
11789 // Nourish vs Idol of the Flourishing Life
11790 if (spellProto->SpellFamilyFlags[1] & 0x02000000)
11791 {
11792 if (AuraEffect const* relicAurEff = GetAuraEffect(64949, EFFECT_0))
11793 {
11794 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11795 }
11796 }
11797 break;
11798 }
11800 {
11801 // Sigil of the Vengeful Heart
11802 if (spellProto->SpellFamilyFlags[0] & 0x2000)
11803 {
11804 if (AuraEffect* aurEff = GetAuraEffect(64962, EFFECT_1))
11805 {
11806 AddPct(DoneTotal, aurEff->GetAmount());
11807 }
11808 }
11809
11810 // Impurity
11812 {
11813 AddPct(ApCoeffMod, aurEff->GetAmount());
11814 }
11815
11816 // Blood Boil - bonus for diseased targets
11817 if ((spellProto->SpellFamilyFlags[0] & 0x00040000) && victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0, 0x00000002, GetGUID()))
11818 {
11819 DoneTotal += 95;
11820 ApCoeffMod = 1.5835f;
11821 }
11822 break;
11823 }
11824 default:
11825 break;
11826 }
11827
11828 // Done fixed damage bonus auras
11829 DoneAdvertisedBenefit += SpellBaseDamageBonusDone(spellProto->GetSchoolMask());
11830
11831 // Check for table values
11832 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
11833 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11834 if (bonus)
11835 {
11836 if (damagetype == DOT)
11837 {
11838 coeff = bonus->dot_damage;
11839 if (bonus->ap_dot_bonus > 0)
11840 {
11841 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11843 APbonus += GetTotalAttackPowerValue(attType);
11844 DoneTotal += int32(bonus->ap_dot_bonus * stack * ApCoeffMod * APbonus);
11845 }
11846 }
11847 else
11848 {
11849 coeff = bonus->direct_damage;
11850 if (bonus->ap_bonus > 0)
11851 {
11852 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11854 APbonus += GetTotalAttackPowerValue(attType);
11855 DoneTotal += int32(bonus->ap_bonus * stack * ApCoeffMod * APbonus);
11856 }
11857 }
11858 }
11859
11860 // Default calculation
11861 if (coeff && DoneAdvertisedBenefit)
11862 {
11863 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11864
11865 if (Player* modOwner = GetSpellModOwner())
11866 {
11867 coeff *= 100.0f;
11868 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
11869 coeff /= 100.0f;
11870 }
11871
11872 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
11873 }
11874
11875 float tmpDamage = (float(pdamage) + DoneTotal) * DoneTotalMod;
11876 // apply spellmod to Done damage (flat and pct)
11877 if (Player* modOwner = GetSpellModOwner())
11878 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, tmpDamage);
11879
11880 return uint32(std::max(tmpDamage, 0.0f));
11881}
@ SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS
Definition: SpellAuraDefines.h:243
@ SPELLMOD_DOT
Definition: SpellDefines.h:98
@ SPELLMOD_BONUS_MULTIPLIER
Definition: SpellDefines.h:100
@ SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS
Definition: SharedDefines.h:644
float GetSpellDamageMod(int32 Rank)
Definition: Creature.cpp:1622
float SpellPctDamageModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition: Unit.cpp:11376
float CalculateLevelPenalty(SpellInfo const *spellProto) const
Definition: Unit.cpp:3074
Definition: SpellMgr.h:324
float ap_dot_bonus
Definition: SpellMgr.h:328
float dot_damage
Definition: SpellMgr.h:326
float ap_bonus
Definition: SpellMgr.h:327
float direct_damage
Definition: SpellMgr.h:325

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, EFFECT_0, EFFECT_1, SpellInfo::Effects, GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), SpellInfo::GetSchoolMask(), Creature::GetSpellDamageMod(), GetSpellModOwner(), GetTotalAttackPowerValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IsControlledByPlayer(), Object::IsCreature(), IsGuardian(), IsPet(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_DAMAGE_CLASS_MELEE, SpellBaseDamageBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctDamageModsDone(), sSpellMgr, and Object::ToCreature().

Referenced by spell_warl_seed_of_corruption_aura::CalculateAmount(), AuraEffect::CalculateAmount(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), spell_warr_bloodthirst::HandleDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ SpellDamageBonusTaken()

uint32 Unit::SpellDamageBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint32  stack = 1 
)
11884{
11885 if (!spellProto || damagetype == DIRECT_DAMAGE)
11886 return pdamage;
11887
11888 int32 TakenTotal = 0;
11889 float TakenTotalMod = 1.0f;
11890
11891 // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
11892 // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085)
11894 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
11895 if (((*i)->GetMiscValue() & spellProto->GetSchoolMask()))
11896 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11897 AddPct(TakenTotalMod, (*i)->GetAmount());
11898
11899 TakenTotalMod = processDummyAuras(TakenTotalMod);
11900
11901 // From caster spells
11902 if (caster)
11903 {
11905 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
11906 if ((*i)->GetCasterGUID() == caster->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
11907 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11908 AddPct(TakenTotalMod, (*i)->GetAmount());
11909 }
11910
11911 if (uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask())
11912 {
11913 int32 modifierMax = 0;
11914 int32 modifierMin = 0;
11916 for (AuraEffectList::const_iterator i = auraEffectList.begin(); i != auraEffectList.end(); ++i)
11917 {
11918 if (!spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11919 continue;
11920
11921 // Only death knight spell with this aura
11922 if ((*i)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
11923 if (!caster || caster->GetGUID() != (*i)->GetCasterGUID())
11924 continue;
11925
11926 if (mechanicMask & uint32(1 << (*i)->GetMiscValue()))
11927 {
11928 if ((*i)->GetAmount() > 0)
11929 {
11930 if ((*i)->GetAmount() > modifierMax)
11931 modifierMax = (*i)->GetAmount();
11932 }
11933 else if ((*i)->GetAmount() < modifierMin)
11934 modifierMin = (*i)->GetAmount();
11935 }
11936 }
11937
11938 AddPct(TakenTotalMod, modifierMax);
11939 AddPct(TakenTotalMod, modifierMin);
11940 }
11941
11942 int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(spellProto->GetSchoolMask(), damagetype == DOT);
11943
11944 // Check for table values
11945 float coeff = 0;
11946 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11947 if (bonus)
11948 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
11949
11950 // Default calculation
11951 if (TakenAdvertisedBenefit)
11952 {
11953 if (coeff <= 0.0f)
11954 {
11955 if (caster)
11956 coeff = caster->CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11957 else
11958 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11959 }
11960
11961 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11962 TakenTotal += int32(TakenAdvertisedBenefit * coeff * factorMod);
11963 }
11964
11965 // No positive taken bonus, custom attr
11966 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
11967 {
11968 TakenTotal = 0;
11969 TakenTotalMod = 1.0f;
11970 }
11971
11972 // xinef: sanctified wrath talent
11973 if (caster && TakenTotalMod < 1.0f && caster->HasIgnoreTargetResistAura())
11974 {
11975 float ignoreModifier = 1.0f - TakenTotalMod;
11976 bool addModifier = false;
11978 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
11979 if ((*j)->GetMiscValue() & spellProto->SchoolMask)
11980 {
11981 ApplyPct(ignoreModifier, (*j)->GetAmount());
11982 addModifier = true;
11983 }
11984
11985 if (addModifier)
11986 TakenTotalMod += ignoreModifier;
11987 }
11988
11989 float tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod;
11990
11991 return uint32(std::max(tmpDamage, 0.0f));
11992}
float CalculateDefaultCoefficient(SpellInfo const *spellInfo, DamageEffectType damagetype) const
Definition: Unit.cpp:17279

References AddPct(), ApplyPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, DOT, SpellBonusEntry::dot_damage, SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasIgnoreTargetResistAura(), SpellInfo::Id, processDummyAuras(), SpellInfo::SchoolMask, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, sSpellMgr, and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by DealMeleeDamage(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and spell_black_temple_l5_arcane_charge::PrepareSpellScript().

◆ SpellDoneCritChance()

float Unit::SpellDoneCritChance ( Unit const *  ,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
12088{
12089 // Mobs can't crit with spells.
12090 if (IsCreature() && !GetSpellModOwner())
12091 return -100.0f;
12092
12093 // not critting spell
12094 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12095 return 0.0f;
12096
12097 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12098 if (!skipEffectCheck && !spellProto->IsCritCapable())
12099 return 0.0f;
12100
12101 float crit_chance = 0.0f;
12102 switch (spellProto->DmgClass)
12103 {
12105 {
12106 if (schoolMask & SPELL_SCHOOL_MASK_NORMAL)
12107 crit_chance = 0.0f;
12108 // For other schools
12109 else if (IsPlayer())
12110 crit_chance = GetFloatValue(static_cast<uint16>(PLAYER_SPELL_CRIT_PERCENTAGE1) + GetFirstSchoolInMask(schoolMask));
12111 else
12112 {
12113 crit_chance = (float)m_baseSpellCritChance;
12115 }
12116 break;
12117 }
12120 {
12121 if (IsPlayer())
12122 {
12123 switch (attackType)
12124 {
12125 case BASE_ATTACK:
12127 break;
12128 case OFF_ATTACK:
12130 break;
12131 case RANGED_ATTACK:
12133 break;
12134 default:
12135 break;
12136 }
12137 }
12138 else
12139 {
12140 crit_chance = 5.0f;
12143 }
12145 break;
12146 }
12147 // values overridden in spellmgr for lifebloom and earth shield
12149 default:
12150 return 0.0f;
12151 }
12152
12153 // percent done
12154 // only players use intelligence for critical chance computations
12155 if (Player* modOwner = GetSpellModOwner())
12156 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRITICAL_CHANCE, crit_chance);
12157
12158 // xinef: can be negative!
12159 return crit_chance;
12160}
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Definition: SpellAuraDefines.h:134
@ SPELLMOD_CRITICAL_CHANCE
Definition: SpellDefines.h:83
@ PLAYER_SPELL_CRIT_PERCENTAGE1
Definition: UpdateFields.h:354
@ SPELL_ATTR2_CANT_CRIT
Definition: SharedDefines.h:496

References BASE_ATTACK, SpellInfo::DmgClass, GetFirstSchoolInMask(), Object::GetFloatValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsCritCapable(), Object::IsPlayer(), m_baseSpellCritChance, OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SPELL_CRIT_PERCENTAGE1, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_CRIT_PCT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, SPELL_AURA_MOD_WEAPON_CRIT_PERCENT, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_SCHOOL_MASK_NORMAL, and SPELLMOD_CRITICAL_CHANCE.

Referenced by Spell::DoAllEffectOnLaunchTarget().

◆ SpellHealingBonusDone()

uint32 Unit::SpellHealingBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
12546{
12547 // For totems get healing bonus from owner (statue isn't totem in fact)
12548 if (IsCreature() && IsTotem())
12549 if (Unit* owner = GetOwner())
12550 return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, effIndex, TotalMod, stack);
12551
12552 // No bonus healing for potion spells
12553 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12554 return healamount;
12555
12556 float ApCoeffMod = 1.0f;
12557 float DoneTotalMod = TotalMod ? TotalMod : SpellPctHealingModsDone(victim, spellProto, damagetype);
12558 int32 DoneTotal = 0;
12559
12560 // done scripted mod (take it from owner)
12561 Unit* owner = GetOwner() ? GetOwner() : this;
12562 int32 DoneAdvertisedBenefit = 0;
12563 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12564 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12565 {
12566 if (!(*i)->IsAffectedOnSpell(spellProto))
12567 continue;
12568
12569 switch ((*i)->GetMiscValue())
12570 {
12571 case 4415: // Increased Rejuvenation Healing
12572 case 4953:
12573 DoneAdvertisedBenefit += (*i)->GetAmount();
12574 break;
12575 case 3736: // Hateful Totem of the Third Wind / Increased Lesser Healing Wave / LK Arena (4/5/6) Totem of the Third Wind / Savage Totem of the Third Wind
12576 DoneAdvertisedBenefit += (*i)->GetAmount();
12577 break;
12578 }
12579 }
12580
12581 switch (spellProto->SpellFamilyName)
12582 {
12584 {
12585 // Impurity
12587 {
12588 AddPct(ApCoeffMod, aurEff->GetAmount());
12589 }
12590 break;
12591 }
12592 default:
12593 break;
12594 }
12595
12596 // Done fixed damage bonus auras
12597 DoneAdvertisedBenefit += SpellBaseHealingBonusDone(spellProto->GetSchoolMask());
12598 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
12599
12600 // Check for table values
12601 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12602 if (bonus)
12603 {
12604 if (damagetype == DOT)
12605 {
12606 coeff = bonus->dot_damage;
12607 if (bonus->ap_dot_bonus > 0)
12608 DoneTotal += int32(bonus->ap_dot_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12609 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12610 }
12611 else
12612 {
12613 coeff = bonus->direct_damage;
12614 if (bonus->ap_bonus > 0)
12615 DoneTotal += int32(bonus->ap_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12616 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12617 }
12618 }
12619 else
12620 {
12621 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12622 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12623 return healamount;
12624 }
12625
12626 // Default calculation
12627 if (DoneAdvertisedBenefit)
12628 {
12629 float factorMod = CalculateLevelPenalty(spellProto) * stack;
12630 if (Player* modOwner = GetSpellModOwner())
12631 {
12632 coeff *= 100.0f;
12633 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12634 coeff /= 100.0f;
12635 }
12636 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
12637 }
12638
12639 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12640 {
12641 switch (spellProto->Effects[i].ApplyAuraName)
12642 {
12643 // Bonus healing does not apply to these spells
12646 DoneTotal = 0;
12647 break;
12648 }
12649 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12650 DoneTotal = 0;
12651 }
12652
12653 // use float as more appropriate for negative values and percent applying
12654 float heal = float(int32(healamount) + DoneTotal) * DoneTotalMod;
12655 // apply spellmod to Done amount
12656
12657 if (Player* modOwner = GetSpellModOwner())
12658 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, heal);
12659
12660 return uint32(std::max(heal, 0.0f));
12661}
@ SPELL_AURA_PERIODIC_HEALTH_FUNNEL
Definition: SpellAuraDefines.h:125
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:12795
float SpellPctHealingModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition: Unit.cpp:12453

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, SpellInfo::Effects, GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAttackPowerValue(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEALTH_FUNNEL, SPELL_AURA_PERIODIC_LEECH, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_EFFECT_HEALTH_LEECH, SpellBaseHealingBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_POTION, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctHealingModsDone(), and sSpellMgr.

Referenced by AuraEffect::CalculateAmount(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_dru_lifebloom::HandleDispel(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHealingBonusTaken()

uint32 Unit::SpellHealingBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint32  stack = 1 
)
12664{
12665 float TakenTotalMod = 1.0f;
12666 float minval = 0.0f;
12667
12668 // Healing taken percent
12669 if (!sScriptMgr->OnSpellHealingBonusTakenNegativeModifiers(this, caster, spellProto, minval))
12670 {
12672 }
12673
12674 if (minval)
12675 AddPct(TakenTotalMod, minval);
12676
12678 if (maxval)
12679 AddPct(TakenTotalMod, maxval);
12680
12681 // Tenacity increase healing % taken
12682 if (AuraEffect const* Tenacity = GetAuraEffect(58549, 0))
12683 AddPct(TakenTotalMod, Tenacity->GetAmount());
12684
12685 // Healing Done
12686 int32 TakenTotal = 0;
12687
12688 // Taken fixed damage bonus auras
12689 int32 TakenAdvertisedBenefit = SpellBaseHealingBonusTaken(spellProto->GetSchoolMask());
12690
12691 // Nourish cast, glyph of nourish
12692 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[1] & 0x2000000 && caster)
12693 {
12694 bool any = false;
12695 bool hasglyph = caster->GetAuraEffectDummy(62971);
12697 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
12698 {
12699 if (((*i)->GetCasterGUID() == caster->GetGUID()))
12700 {
12701 SpellInfo const* spell = (*i)->GetSpellInfo();
12702 // Rejuvenation, Regrowth, Lifebloom, or Wild Growth
12703 if (!any && spell->SpellFamilyFlags.HasFlag(0x50, 0x4000010, 0))
12704 {
12705 TakenTotalMod *= 1.2f;
12706 any = true;
12707 }
12708
12709 if (hasglyph)
12710 TakenTotalMod += 0.06f;
12711 }
12712 }
12713 }
12714
12715 if (damagetype == DOT)
12716 {
12717 // Healing over time taken percent
12718 float minval_hot = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12719 if (minval_hot)
12720 AddPct(TakenTotalMod, minval_hot);
12721
12722 float maxval_hot = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12723 if (maxval_hot)
12724 AddPct(TakenTotalMod, maxval_hot);
12725 }
12726
12727 // Check for table values
12728 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12729 float coeff = 0;
12730 float factorMod = 1.0f;
12731 if (bonus)
12732 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
12733 else
12734 {
12735 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12736 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12737 {
12738 healamount = uint32(std::max((float(healamount) * TakenTotalMod), 0.0f));
12739 return healamount;
12740 }
12741 }
12742
12743 // Default calculation
12744 if (TakenAdvertisedBenefit)
12745 {
12746 float TakenCoeff = 0.0f;
12747 if (coeff <= 0)
12748 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack) * 1.88f; // As wowwiki says: C = (Cast Time / 3.5) * 1.88 (for healing spells)
12749
12750 factorMod *= CalculateLevelPenalty(spellProto) * int32(stack);
12751 if (Player* modOwner = GetSpellModOwner())
12752 {
12753 coeff *= 100.0f;
12754 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12755 coeff /= 100.0f;
12756 }
12757
12758 TakenTotal += int32(TakenAdvertisedBenefit * (coeff > 0 ? coeff : TakenCoeff) * factorMod);
12759 }
12760
12761 if (caster)
12762 {
12764 for (AuraEffectList::const_iterator i = mHealingGet.begin(); i != mHealingGet.end(); ++i)
12765 if (caster->GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectedOnSpell(spellProto))
12766 AddPct(TakenTotalMod, (*i)->GetAmount());
12767 }
12768
12769 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12770 {
12771 switch (spellProto->Effects[i].ApplyAuraName)
12772 {
12773 // Bonus healing does not apply to these spells
12776 TakenTotal = 0;
12777 break;
12778 }
12779 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12780 TakenTotal = 0;
12781 }
12782
12783 // No positive taken bonus, custom attr
12784 if ((spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS) || spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS)) && TakenTotalMod > 1.0f)
12785 {
12786 TakenTotal = 0;
12787 TakenTotalMod = 1.0f;
12788 }
12789
12790 float heal = float(int32(healamount) + TakenTotal) * TakenTotalMod;
12791
12792 return uint32(std::max(heal, 0.0f));
12793}
@ SPELL_AURA_MOD_HEALING_RECEIVED
Definition: SpellAuraDefines.h:346
@ SPELL_AURA_MOD_HEALING_PCT
Definition: SpellAuraDefines.h:181
@ SPELL_AURA_MOD_HOT_PCT
Definition: SpellAuraDefines.h:322
@ SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS
Definition: SharedDefines.h:642
int32 GetMaxPositiveAuraModifier(AuraType auratype)
Definition: Unit.cpp:6031
int32 GetMaxNegativeAuraModifier(AuraType auratype) const
Definition: Unit.cpp:6045
int32 SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask)
Definition: Unit.cpp:12829

References AddPct(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, GetAuraEffect(), GetAuraEffectDummy(), GetAuraEffectsByType(), Object::GetGUID(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), SpellInfo::GetSchoolMask(), flag96::HasFlag(), SpellInfo::Id, SPELL_AURA_MOD_HEALING_PCT, SPELL_AURA_MOD_HOT_PCT, SPELL_AURA_PERIODIC_HEAL, SPELL_DAMAGE_CLASS_NONE, SpellBaseHealingBonusTaken(), SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, sScriptMgr, and sSpellMgr.

Referenced by spell_dru_lifebloom::AfterRemove(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_pri_renew::HandleApplyEffect(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHitResult() [1/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
Spell const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3570{
3571 SpellInfo const* spellInfo = spell->GetSpellInfo();
3572
3573 // Check for immune
3574 if (victim->IsImmunedToSpell(spellInfo, spell))
3575 {
3576 return SPELL_MISS_IMMUNE;
3577 }
3578
3579 // All positive spells can`t miss
3581 if ((spellInfo->IsPositive() || spellInfo->HasEffect(SPELL_EFFECT_DISPEL))
3582 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3583 {
3584 return SPELL_MISS_NONE;
3585 }
3586
3587 // Check for immune
3588 // xinef: check for school immunity only
3589 if (victim->IsImmunedToSchool(spell))
3590 {
3591 return SPELL_MISS_IMMUNE;
3592 }
3593
3594 if (this == victim)
3595 {
3596 return SPELL_MISS_NONE;
3597 }
3598
3599 // Return evade for units in evade mode
3600 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) &&
3602 {
3603 return SPELL_MISS_EVADE;
3604 }
3605
3606 // Try victim reflect spell
3607 if (CanReflect)
3608 {
3609 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3610 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3611 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3612 {
3613 if ((*i)->GetMiscValue() & spell->GetSpellSchoolMask())
3614 {
3615 reflectchance += (*i)->GetAmount();
3616 }
3617 }
3618
3619 if (reflectchance > 0 && roll_chance_i(reflectchance))
3620 {
3621 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3622 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3623 return SPELL_MISS_REFLECT;
3624 }
3625 }
3626
3627 switch (spellInfo->DmgClass)
3628 {
3631 return MeleeSpellHitResult(victim, spellInfo);
3633 {
3634 if (spellInfo->SpellFamilyName)
3635 {
3636 return SPELL_MISS_NONE;
3637 }
3638
3639 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3640 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3641 {
3642 if (spellInfo->Effects[i].Effect && spellInfo->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3643 {
3644 if (spellInfo->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3645 {
3646 return SPELL_MISS_NONE;
3647 }
3648 }
3649 }
3650 [[fallthrough]];
3651 }
3653 return MagicSpellHitResult(victim, spellInfo);
3654 }
3655
3656 return SPELL_MISS_NONE;
3657}
@ SPELL_EFFECT_DISPEL
Definition: SharedDefines.h:827
@ SPELL_MISS_IMMUNE
Definition: SharedDefines.h:1537
@ SPELL_MISS_EVADE
Definition: SharedDefines.h:1536
@ SPELL_MISS_REFLECT
Definition: SharedDefines.h:1541
SpellMissInfo MagicSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition: Unit.cpp:3361
SpellMissInfo MeleeSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition: Unit.cpp:3188

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, and Object::ToCreature().

◆ SpellHitResult() [2/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
SpellInfo const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3505{
3506 // Check for immune
3507 if (victim->IsImmunedToSpell(spell))
3508 return SPELL_MISS_IMMUNE;
3509
3510 // All positive spells can`t miss
3512 if ((spell->IsPositive() || spell->HasEffect(SPELL_EFFECT_DISPEL))
3513 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3514 return SPELL_MISS_NONE;
3515
3516 // Check for immune
3517 // xinef: check for school immunity only
3518 if (victim->IsImmunedToSchool(spell))
3519 return SPELL_MISS_IMMUNE;
3520
3521 if (this == victim)
3522 return SPELL_MISS_NONE;
3523
3524 // Return evade for units in evade mode
3525 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spell->HasAura(SPELL_AURA_CONTROL_VEHICLE)
3526 && !spell->HasAttribute(SPELL_ATTR0_CU_IGNORE_EVADE) && !spell->HasAttribute(SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT))
3527 return SPELL_MISS_EVADE;
3528
3529 // Try victim reflect spell
3530 if (CanReflect)
3531 {
3532 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3533 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3534 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3535 if ((*i)->GetMiscValue() & spell->GetSchoolMask())
3536 reflectchance += (*i)->GetAmount();
3537 if (reflectchance > 0 && roll_chance_i(reflectchance))
3538 {
3539 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3540 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3541 return SPELL_MISS_REFLECT;
3542 }
3543 }
3544
3545 switch (spell->DmgClass)
3546 {
3549 return MeleeSpellHitResult(victim, spell);
3551 {
3552 if (spell->SpellFamilyName)
3553 {
3554 return SPELL_MISS_NONE;
3555 }
3556 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3557 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3558 if (spell->Effects[i].Effect && spell->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3559 if (spell->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3560 return SPELL_MISS_NONE;
3561 [[fallthrough]];
3562 }
3564 return MagicSpellHitResult(victim, spell);
3565 }
3566 return SPELL_MISS_NONE;
3567}

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, and Object::ToCreature().

Referenced by Spell::AddUnitTarget(), DealMeleeDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SpellPctDamageModsDone()

float Unit::SpellPctDamageModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
11377{
11378 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11379 return 1.0f;
11380
11381 // Some spells don't benefit from done mods
11382 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11383 return 1.0f;
11384
11385 // For totems get damage bonus from owner
11386 if (IsCreature())
11387 {
11388 if (IsTotem())
11389 {
11390 if (Unit* owner = GetOwner())
11391 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11392 }
11393 // Dancing Rune Weapon...
11394 else if (GetEntry() == 27893)
11395 {
11396 if (Unit* owner = GetOwner())
11397 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11398 }
11399 }
11400
11401 // Done total percent damage auras
11402 float DoneTotalMod = 1.0f;
11403
11405 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
11406 {
11407 // prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization)
11408 if (spellProto->EquippedItemClass == -1 && (*i)->GetSpellInfo()->EquippedItemClass != -1 &&
11409 !(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && (*i)->GetMiscValue() == SPELL_SCHOOL_MASK_NORMAL)
11410 {
11411 continue;
11412 }
11413
11414 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11415 continue;
11416
11417 if (!sScriptMgr->IsNeedModSpellDamagePercent(this, *i, DoneTotalMod, spellProto))
11418 continue;
11419
11420 if ((*i)->GetMiscValue() & spellProto->GetSchoolMask())
11421 {
11422 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
11423 AddPct(DoneTotalMod, (*i)->GetAmount());
11424 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
11425 AddPct(DoneTotalMod, (*i)->GetAmount());
11426 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
11427 AddPct(DoneTotalMod, (*i)->GetAmount());
11428 }
11429 }
11430
11431 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11433 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
11434 if ((creatureTypeMask & uint32((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11435 AddPct(DoneTotalMod, (*i)->GetAmount());
11436
11437 // bonus against aurastate
11439 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
11440 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11441 AddPct(DoneTotalMod, (*i)->GetAmount());
11442
11443 // done scripted mod (take it from owner)
11444 Unit* owner = GetOwner() ? GetOwner() : this;
11445 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11446 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11447 {
11448 // Xinef: self cast is ommited (because of Rage of Rivendare)
11449 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11450 continue;
11451
11452 // xinef: Molten Fury should work on all spells
11453 switch ((*i)->GetMiscValue())
11454 {
11455 case 4920: // Molten Fury
11456 case 4919:
11457 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11458 AddPct(DoneTotalMod, (*i)->GetAmount());
11459 break;
11460 }
11461
11462 if (!(*i)->IsAffectedOnSpell(spellProto))
11463 continue;
11464
11465 switch ((*i)->GetMiscValue())
11466 {
11467 case 6917: // Death's Embrace
11468 case 6926:
11469 case 6928:
11470 {
11471 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11472 AddPct(DoneTotalMod, (*i)->GetAmount());
11473 break;
11474 }
11475 // Soul Siphon
11476 case 4992:
11477 case 4993:
11478 {
11479 // effect 1 m_amount
11480 int32 maxPercent = (*i)->GetAmount();
11481 // effect 0 m_amount
11482 int32 stepPercent = CalculateSpellDamage(this, (*i)->GetSpellInfo(), 0);
11483 // count affliction effects and calc additional damage in percentage
11484 int32 modPercent = 0;
11485 AuraApplicationMap const& victimAuras = victim->GetAppliedAuras();
11486 for (AuraApplicationMap::const_iterator itr = victimAuras.begin(); itr != victimAuras.end(); ++itr)
11487 {
11488 Aura const* aura = itr->second->GetBase();
11489 SpellInfo const* m_spell = aura->GetSpellInfo();
11490 if (m_spell->SpellFamilyName != SPELLFAMILY_WARLOCK || !(m_spell->SpellFamilyFlags[1] & 0x0004071B || m_spell->SpellFamilyFlags[0] & 0x8044C402))
11491 continue;
11492 modPercent += stepPercent * aura->GetStackAmount();
11493 if (modPercent >= maxPercent)
11494 {
11495 modPercent = maxPercent;
11496 break;
11497 }
11498 }
11499 AddPct(DoneTotalMod, modPercent);
11500 break;
11501 }
11502 case 6916: // Death's Embrace
11503 case 6925:
11504 case 6927:
11505 if (HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, spellProto, this))
11506 AddPct(DoneTotalMod, (*i)->GetAmount());
11507 break;
11508 case 5481: // Starfire Bonus
11509 {
11510 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x200002, 0, 0))
11511 AddPct(DoneTotalMod, (*i)->GetAmount());
11512 break;
11513 }
11514 // Tundra Stalker
11515 // Merciless Combat
11516 case 7277:
11517 {
11518 // Merciless Combat
11519 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
11520 {
11521 if ((spellProto && spellProto->SpellFamilyFlags[0] & 0x2) || spellProto->SpellFamilyFlags[1] & 0x2 )
11522 if (!victim->HealthAbovePct(35))
11523 AddPct(DoneTotalMod, (*i)->GetAmount());
11524 }
11525 // Tundra Stalker
11526 else
11527 {
11528 // Frost Fever (target debuff)
11529 if (victim->HasAura(55095))
11530 AddPct(DoneTotalMod, (*i)->GetAmount());
11531 break;
11532 }
11533 break;
11534 }
11535 // Rage of Rivendare
11536 case 7293:
11537 {
11539 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
11540 break;
11541 }
11542 // Twisted Faith
11543 case 7377:
11544 {
11546 AddPct(DoneTotalMod, (*i)->GetAmount());
11547 break;
11548 }
11549 // Marked for Death
11550 case 7598:
11551 case 7599:
11552 case 7600:
11553 case 7601:
11554 case 7602:
11555 {
11556 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
11557 AddPct(DoneTotalMod, (*i)->GetAmount());
11558 break;
11559 }
11560 // Dirty Deeds
11561 case 6427:
11562 case 6428:
11563 case 6579:
11564 case 6580:
11565 {
11566 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11567 {
11568 // effect 0 has expected value but in negative state
11569 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
11570 AddPct(DoneTotalMod, bonus);
11571 }
11572 break;
11573 }
11574 }
11575 }
11576
11577 // Custom scripted damage
11578 switch (spellProto->SpellFamilyName)
11579 {
11580 case SPELLFAMILY_MAGE:
11581 // Ice Lance
11582 if (spellProto->SpellIconID == 186)
11583 {
11584 if (victim->HasAuraState(AURA_STATE_FROZEN, spellProto, this))
11585 {
11586 // Glyph of Ice Lance
11587 if (owner->HasAura(56377) && victim->GetLevel() > owner->GetLevel())
11588 DoneTotalMod *= 4.0f;
11589 else
11590 DoneTotalMod *= 3.0f;
11591 }
11592 }
11593
11594 // Torment the weak
11595 if (spellProto->SpellFamilyFlags[0] & 0x20600021 || spellProto->SpellFamilyFlags[1] & 0x9000)
11596 if (victim->HasAuraWithMechanic((1 << MECHANIC_SNARE) | (1 << MECHANIC_SLOW_ATTACK)))
11598 AddPct(DoneTotalMod, aurEff->GetAmount());
11599 break;
11600 case SPELLFAMILY_PRIEST:
11601 // Mind Flay
11602 if (spellProto->SpellFamilyFlags[0] & 0x800000)
11603 {
11604 // Glyph of Shadow Word: Pain
11605 if (AuraEffect* aurEff = GetAuraEffect(55687, 0))
11606 // Increase Mind Flay damage if Shadow Word: Pain present on target
11608 AddPct(DoneTotalMod, aurEff->GetAmount());
11609
11610 // Twisted Faith - Mind Flay part
11612 // Increase Mind Flay damage if Shadow Word: Pain present on target
11614 AddPct(DoneTotalMod, aurEff->GetAmount());
11615 }
11616 // Smite
11617 else if (spellProto->SpellFamilyFlags[0] & 0x80)
11618 {
11619 // Glyph of Smite
11620 if (AuraEffect* aurEff = GetAuraEffect(55692, 0))
11621 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x100000, 0, 0, GetGUID()))
11622 AddPct(DoneTotalMod, aurEff->GetAmount());
11623 }
11624 // Shadow Word: Death
11625 else if (spellProto->SpellFamilyFlags[1] & 0x2)
11626 {
11627 // Glyph of Shadow Word: Death
11628 if (AuraEffect* aurEff = GetAuraEffect(55682, 1))
11630 AddPct(DoneTotalMod, aurEff->GetAmount());
11631 }
11632
11633 break;
11635 // Judgement of Vengeance/Judgement of Corruption
11636 if ((spellProto->SpellFamilyFlags[1] & 0x400000) && spellProto->SpellIconID == 2292)
11637 {
11638 // Get stack of Holy Vengeance/Blood Corruption on the target added by caster
11639 uint32 stacks = 0;
11641 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
11642 if (((*itr)->GetId() == 31803 || (*itr)->GetId() == 53742) && (*itr)->GetCasterGUID() == GetGUID())
11643 {
11644 stacks = (*itr)->GetBase()->GetStackAmount();
11645 break;
11646 }
11647 // + 10% for each application of Holy Vengeance/Blood Corruption on the target
11648 if (stacks)
11649 AddPct(DoneTotalMod, 10 * stacks);
11650 }
11651 break;
11652 case SPELLFAMILY_DRUID:
11653 // Thorns
11654 if (spellProto->SpellFamilyFlags[0] & 0x100)
11655 {
11656 // Brambles
11657 if (AuraEffect* aurEff = GetAuraEffectOfRankedSpell(16836, 0))
11658 AddPct(DoneTotalMod, aurEff->GetAmount());
11659 }
11660 break;
11662 // Fire and Brimstone
11663 if (spellProto->SpellFamilyFlags[1] & 0x00020040)
11665 {
11667 for (AuraEffectList::const_iterator i = mDumyAuras.begin(); i != mDumyAuras.end(); ++i)
11668 if ((*i)->GetSpellInfo()->SpellIconID == 3173)
11669 {
11670 AddPct(DoneTotalMod, (*i)->GetAmount());
11671 break;
11672 }
11673 }
11674 // Drain Soul - increased damage for targets under 25 % HP
11675 if (spellProto->SpellFamilyFlags[0] & 0x00004000)
11676 if (!victim->HealthAbovePct(25))
11677 DoneTotalMod *= 4;
11678 // Shadow Bite (15% increase from each dot)
11679 if (spellProto->SpellFamilyFlags[1] & 0x00400000 && IsPet())
11680 if (uint8 count = victim->GetDoTsByCaster(GetOwnerGUID()))
11681 AddPct(DoneTotalMod, 15 * count);
11682 break;
11683 case SPELLFAMILY_HUNTER:
11684 // Steady Shot
11685 if (spellProto->SpellFamilyFlags[1] & 0x1)
11686 if (AuraEffect* aurEff = GetAuraEffect(56826, 0)) // Glyph of Steady Shot
11687 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_HUNTER, 0x00004000, 0, 0, GetGUID()))
11688 AddPct(DoneTotalMod, aurEff->GetAmount());
11689 break;
11691 // Improved Icy Touch
11692 if (spellProto->SpellFamilyFlags[0] & 0x2)
11694 AddPct(DoneTotalMod, aurEff->GetAmount());
11695
11696 // Glacier Rot
11697 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
11699 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
11700 AddPct(DoneTotalMod, aurEff->GetAmount());
11701 break;
11702 }
11703
11704 return DoneTotalMod;
11705}
@ MECHANIC_SLOW_ATTACK
Definition: SharedDefines.h:1344
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition: SharedDefines.h:1304
@ AURA_STATE_CONFLAGRATE
Definition: SharedDefines.h:1317
uint32 GetDiseasesByCaster(ObjectGuid casterGUID, uint8 mode=0)
Definition: Unit.cpp:5909
bool HasAuraWithMechanic(uint32 mechanicMask) const
Definition: Unit.cpp:5880
uint32 GetDoTsByCaster(ObjectGuid casterGUID) const
Definition: Unit.cpp:5963

References AddPct(), AURA_STATE_CONFLAGRATE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, CalculateSpellDamage(), DIRECT_DAMAGE, DOT, EFFECT_0, SpellInfo::EquippedItemClass, GetAppliedAuras(), GetAuraEffect(), GetAuraEffectOfRankedSpell(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDoTsByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetLevel(), GetOwner(), GetOwnerGUID(), SpellInfo::GetSchoolMask(), Aura::GetSpellInfo(), Aura::GetStackAmount(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), HealthAbovePct(), Object::IsCreature(), IsPet(), IsTotem(), MECHANIC_SLOW_ATTACK, MECHANIC_SNARE, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM, SPELL_AURA_DUMMY, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sScriptMgr, Object::ToPlayer(), and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by AuraEffect::CalculatePeriodicData(), and SpellDamageBonusDone().

◆ SpellPctHealingModsDone()

float Unit::SpellPctHealingModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
12454{
12455 // For totems get healing bonus from owner (statue isn't totem in fact)
12456 if (IsCreature() && IsTotem())
12457 if (Unit* owner = GetOwner())
12458 return owner->SpellPctHealingModsDone(victim, spellProto, damagetype);
12459
12460 // Some spells don't benefit from done mods
12461 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
12462 return 1.0f;
12463
12464 // xinef: Some spells don't benefit from done mods
12465 if (spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS))
12466 return 1.0f;
12467
12468 // No bonus healing for potion spells
12469 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12470 return 1.0f;
12471
12472 float DoneTotalMod = 1.0f;
12473
12474 // Healing done percent
12476 for (auto const& auraEff : mHealingDonePct)
12477 {
12478 if (!sScriptMgr->IsNeedModHealPercent(this, auraEff, DoneTotalMod, spellProto))
12479 continue;
12480
12481 AddPct(DoneTotalMod, auraEff->GetAmount());
12482 }
12483
12484 // done scripted mod (take it from owner)
12485 Unit* owner = GetOwner() ? GetOwner() : this;
12486 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12487 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12488 {
12489 if (!(*i)->IsAffectedOnSpell(spellProto))
12490 continue;
12491
12492 switch ((*i)->GetMiscValue())
12493 {
12494 case 21: // Test of Faith
12495 case 6935:
12496 case 6918:
12497 if (victim->HealthBelowPct(50))
12498 AddPct(DoneTotalMod, (*i)->GetAmount());
12499 break;
12500 case 7798: // Glyph of Regrowth
12501 {
12503 AddPct(DoneTotalMod, (*i)->GetAmount());
12504 break;
12505 }
12506
12507 case 7871: // Glyph of Lesser Healing Wave
12508 {
12509 // xinef: affected by any earth shield
12510 if (victim->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0, 0x00000400, 0))
12511 AddPct(DoneTotalMod, (*i)->GetAmount());
12512 break;
12513 }
12514 default:
12515 break;
12516 }
12517 }
12518
12519 switch (spellProto->SpellFamilyName)
12520 {
12522 // Talents and glyphs for healing stream totem
12523 if (spellProto->Id == 52042)
12524 {
12525 // Glyph of Healing Stream Totem
12526 if (AuraEffect* dummy = owner->GetAuraEffect(55456, EFFECT_0))
12527 AddPct(DoneTotalMod, dummy->GetAmount());
12528
12529 // Healing Stream totem - Restorative Totems
12530 if (AuraEffect* aurEff = GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 338, 1))
12531 AddPct(DoneTotalMod, aurEff->GetAmount());
12532 }
12533 break;
12534 case SPELLFAMILY_PRIEST:
12535 // T9 HEALING 4P, empowered renew instant heal
12536 if (spellProto->Id == 63544)
12537 if (AuraEffect* aurEff = GetAuraEffect(67202, EFFECT_0))
12538 AddPct(DoneTotalMod, aurEff->GetAmount());
12539 break;
12540 }
12541
12542 return DoneTotalMod;
12543}
@ SPELL_AURA_MOD_HEALING_DONE_PERCENT
Definition: SpellAuraDefines.h:199

References AddPct(), EFFECT_0, GetAuraEffect(), GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::HasAttribute(), HealthBelowPct(), SpellInfo::Id, Object::IsCreature(), IsTotem(), SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS, SPELL_AURA_DUMMY, SPELL_AURA_MOD_HEALING_DONE_PERCENT, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SpellInfo::SpellFamilyName, and sScriptMgr.

Referenced by AuraEffect::CalculatePeriodicData(), and SpellHealingBonusDone().

◆ SpellTakenCritChance()

float Unit::SpellTakenCritChance ( Unit const *  caster,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
float  doneChance,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
12163{
12164 // not critting spell
12165 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12166 return 0.0f;
12167
12168 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12169 if (!skipEffectCheck && !spellProto->IsCritCapable())
12170 return 0.0f;
12171
12172 float crit_chance = doneChance;
12173 switch (spellProto->DmgClass)
12174 {
12176 {
12177 if (!spellProto->IsPositive())
12178 {
12179 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
12180 // xinef: apply max and min only
12182 {
12185 }
12186
12187 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_SPELL);
12188 }
12189 // scripted (increase crit chance ... against ... target by x%
12190 if (caster)
12191 {
12192 AuraEffectList const& mOverrideClassScript = caster->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12193 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12194 {
12195 if (!((*i)->IsAffectedOnSpell(spellProto)))
12196 continue;
12197 int32 modChance = 0;
12198 switch ((*i)->GetMiscValue())
12199 {
12200 // Shatter
12201 case 911:
12202 modChance += 16;
12203 [[fallthrough]];
12204 case 910:
12205 modChance += 17;
12206 [[fallthrough]];
12207 case 849:
12208 modChance += 17;
12209 if (!HasAuraState(AURA_STATE_FROZEN, spellProto, caster))
12210 break;
12211 crit_chance += modChance;
12212 break;
12213 case 7917: // Glyph of Shadowburn
12214 if (HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, caster))
12215 crit_chance += (*i)->GetAmount();
12216 break;
12217 case 7997: // Renewed Hope
12218 case 7998:
12219 if (HasAura(6788))
12220 crit_chance += (*i)->GetAmount();
12221 break;
12222 default:
12223 break;
12224 }
12225 }
12226 // Custom crit by class
12227 switch (spellProto->SpellFamilyName)
12228 {
12229 case SPELLFAMILY_MAGE:
12230 // Glyph of Fire Blast
12231 if (spellProto->SpellFamilyFlags[0] == 0x2 && spellProto->SpellIconID == 12)
12233 if (AuraEffect const* aurEff = caster->GetAuraEffect(56369, EFFECT_0))
12234 crit_chance += aurEff->GetAmount();
12235 break;
12236 case SPELLFAMILY_DRUID:
12237 // Improved Faerie Fire
12239 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 109, 0))
12240 crit_chance += aurEff->GetAmount();
12241
12242 // cumulative effect - don't break
12243
12244 // Starfire
12245 if (spellProto->SpellFamilyFlags[0] & 0x4 && spellProto->SpellIconID == 1485)
12246 {
12247 // Improved Insect Swarm
12248 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 1771, 0))
12250 crit_chance += aurEff->GetAmount();
12251 break;
12252 }
12253 break;
12254 case SPELLFAMILY_ROGUE:
12255 // Shiv-applied poisons can't crit
12256 if (caster->FindCurrentSpellBySpellId(5938))
12257 crit_chance = 0.0f;
12258 break;
12260 // Flash of light
12261 if (spellProto->SpellFamilyFlags[0] & 0x40000000)
12262 {
12263 // Sacred Shield
12264 if (AuraEffect const* aura = GetAuraEffect(58597, 1, GetGUID()))
12265 crit_chance += aura->GetAmount();
12266 break;
12267 }
12268 // Exorcism
12269 else if (spellProto->GetCategory() == 19)
12270 {
12272 return 100.0f;
12273 break;
12274 }
12275 break;
12276 case SPELLFAMILY_SHAMAN:
12277 // Lava Burst
12278 if (spellProto->SpellFamilyFlags[1] & 0x00001000)
12279 {
12280 if (GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0, 0, caster->GetGUID()))
12282 return 100.0f;
12283 break;
12284 }
12285 break;
12286 }
12287 }
12288 break;
12289 }
12291 // Custom crit by class
12292 if (caster)
12293 {
12294 switch (spellProto->SpellFamilyName)
12295 {
12296 case SPELLFAMILY_DRUID:
12297 // Rend and Tear - bonus crit chance for Ferocious Bite on bleeding targets
12298 if (spellProto->SpellFamilyFlags[0] & 0x00800000 && spellProto->SpellIconID == 1680 && HasAuraState(AURA_STATE_BLEEDING))
12299 {
12300 if (AuraEffect const* rendAndTear = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 2859, 1))
12301 crit_chance += rendAndTear->GetAmount();
12302 break;
12303 }
12304 break;
12306 // Victory Rush
12307 if (spellProto->SpellFamilyFlags[1] & 0x100)
12308 {
12309 // Glyph of Victory Rush
12310 if (AuraEffect const* aurEff = caster->GetAuraEffect(58382, 0))
12311 crit_chance += aurEff->GetAmount();
12312 break;
12313 }
12314 break;
12315 }
12316 }
12317
12318 // 100% critical chance against sitting target
12320 {
12321 return 100.0f;
12322 }
12323 [[fallthrough]];
12325 {
12326 // flat aura mods
12327 if (attackType == RANGED_ATTACK)
12329 else
12331
12332 // reduce crit chance from Rating for players
12333 if (attackType != RANGED_ATTACK)
12334 {
12335 // xinef: little hack, crit chance dont require caster to calculate, pass victim
12336 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_MELEE);
12337 }
12338 else
12339 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_RANGED);
12340
12341 // Apply crit chance from defence skill
12342 if (caster)
12343 crit_chance += (int32(caster->GetMaxSkillValueForLevel(this)) - int32(GetDefenseSkillValue(caster))) * 0.04f;
12344
12345 break;
12346 }
12347 // values overridden in spellmgr for lifebloom and earth shield
12349 default:
12350 return 0.0f;
12351 }
12352
12353 if (caster)
12354 {
12356 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
12357 {
12358 if (caster->GetGUID() != (*i)->GetCasterGUID())
12359 continue;
12360
12361 crit_chance += (*i)->GetAmount();
12362 }
12363 }
12364
12365 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
12366 // xinef: should be calculated at the end
12367 if (!spellProto->IsPositive())
12369
12370 // xinef: can be negative!
12371 return crit_chance;
12372}
uint32 const CREATURE_TYPEMASK_DEMON_OR_UNDEAD
Definition: SharedDefines.h:2654
@ MECHANIC_KNOCKOUT
Definition: SharedDefines.h:1350
@ AURA_STATE_BLEEDING
Definition: SharedDefines.h:1321
@ AURA_STATE_FAERIE_FIRE
Definition: SharedDefines.h:1315
int32 GetMaxPositiveAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
Definition: Unit.cpp:6082
bool HasAttackerSpellCritChanceAura() const
Definition: Unit.h:1749
int32 GetMaxNegativeAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:6096

References ApplyResilience(), AURA_STATE_BLEEDING, AURA_STATE_FAERIE_FIRE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_35_PERCENT, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CREATURE_TYPEMASK_DEMON_OR_UNDEAD, SpellInfo::DmgClass, EFFECT_0, FindCurrentSpellBySpellId(), GetAuraEffect(), GetAuraEffectsByType(), SpellInfo::GetCategory(), GetCreatureTypeMask(), GetDefenseSkillValue(), GetDummyAuraEffect(), Object::GetGUID(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxSkillValueForLevel(), getStandState(), GetTotalAuraModifier(), HasAttackerSpellCritChanceAura(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), SpellInfo::IsCritCapable(), Object::IsPlayer(), SpellInfo::IsPositive(), IsSitState(), MECHANIC_KNOCKOUT, MECHANIC_STUN, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLFAMILY_DRUID, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, and UNIT_STAND_STATE_SLEEP.

Referenced by AuraEffect::CalcPeriodicCritChance(), and Spell::DoAllEffectOnLaunchTarget().

◆ StartReactiveTimer()

void Unit::StartReactiveTimer ( ReactiveType  reactive)
inline
#define REACTIVE_TIMER_START
Definition: Unit.h:591

References m_reactiveTimer, and REACTIVE_TIMER_START.

Referenced by ProcDamageAndSpellFor().

◆ StopAttackFaction()

void Unit::StopAttackFaction ( uint32  faction_id)
20000{
20001 if (Unit* victim = GetVictim())
20002 {
20003 if (victim->GetFactionTemplateEntry()->faction == faction_id)
20004 {
20005 AttackStop();
20006 if (IsNonMeleeSpellCast(false))
20008
20009 // melee and ranged forced attack cancel
20010 if (IsPlayer())
20012 }
20013 }
20014
20015 AttackerSet const& attackers = getAttackers();
20016 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20017 {
20018 if ((*itr)->GetFactionTemplateEntry()->faction == faction_id)
20019 {
20020 (*itr)->AttackStop();
20021 itr = attackers.begin();
20022 }
20023 else
20024 ++itr;
20025 }
20026
20028
20029 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20030 (*itr)->StopAttackFaction(faction_id);
20031}
void deleteReferencesForFaction(uint32 faction)
Definition: HostileRefMgr.cpp:162

References AttackStop(), HostileRefMgr::deleteReferencesForFaction(), getAttackers(), getHostileRefMgr(), GetVictim(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by AuraEffect::HandleForceReaction().

◆ StopAttackingInvalidTarget()

void Unit::StopAttackingInvalidTarget ( )
20034{
20035 AttackerSet const& attackers = getAttackers();
20036 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20037 {
20038 Unit* attacker = (*itr);
20039 if (!attacker->IsValidAttackTarget(this))
20040 {
20041 attacker->AttackStop();
20042 if (attacker->IsPlayer())
20043 {
20045 }
20046
20047 for (Unit* controlled : attacker->m_Controlled)
20048 {
20049 if (controlled->GetVictim() == this && !controlled->IsValidAttackTarget(this))
20050 {
20051 controlled->AttackStop();
20052 }
20053 }
20054
20055 itr = attackers.begin();
20056 }
20057 else
20058 {
20059 ++itr;
20060 }
20061 }
20062}

References AttackStop(), getAttackers(), GetVictim(), Object::IsPlayer(), IsValidAttackTarget(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by RemoveCharmedBy(), and SetCharmedBy().

◆ StopMoving()

void Unit::StopMoving ( )
16734{
16736
16737 // not need send any packets if not in world or not moving
16738 if (!IsInWorld())
16739 return;
16740
16741 if (movespline->Finalized())
16742 return;
16743
16744 // Update position now since Stop does not start a new movement that can be updated later
16745 if (movespline->HasStarted())
16747
16748 Movement::MoveSplineInit init(this);
16749 init.Stop();
16750}
void UpdateSplinePosition()
Definition: Unit.cpp:609
bool HasStarted() const
Definition: MoveSpline.h:129

References ClearUnitState(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::HasStarted(), Object::IsInWorld(), movespline, Movement::MoveSplineInit::Stop(), UNIT_STATE_MOVING, and UpdateSplinePosition().

Referenced by npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_alar::ConstructWaypointsAndMove(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), ScriptedAI::DoCastSpell(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), ChaseMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), WorldSession::HandlePetActionHelper(), RotateMovementGenerator::Initialize(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_kologarn::boss_kologarnAI::JustDied(), boss_swamplord_muselek::JustEngagedWith(), boss_janalai::JustEngagedWith(), Player::LeaveBattleground(), boss_headless_horseman::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), PauseMovement(), SmartAI::PausePath(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), RemoveCharmedBy(), Creature::RemoveCorpse(), boss_felblood_kaelthas::Reset(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), boss_leotheras_the_blind::Reset(), IdleMovementGenerator::Reset(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), SmartAI::SetCombatMovement(), SetConfused(), boss_victor_nefarius::boss_victor_nefariusAI::SetData(), setDeathState(), SetFeared(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), SetRooted(), npc_magister_aledis::sGossipSelect(), npc_harrison_jones::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), SmartAI::StopFollow(), SmartAI::StopPath(), CreatureAI::TriggerAlert(), Pet::Update(), TimedFleeingMovementGenerator::Update(), boss_onyxia::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), and PetAI::UpdateAI().

◆ StopMovingOnCurrentPos()

void Unit::StopMovingOnCurrentPos ( )
16773{
16775
16776 // not need send any packets if not in world
16777 if (!IsInWorld())
16778 return;
16779
16780 DisableSpline(); // pussywizard: required so Launch() won't recalculate position from previous spline
16781 Movement::MoveSplineInit init(this);
16782 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
16783 init.SetFacing(GetOrientation());
16784 init.Launch();
16785}

References ClearUnitState(), DisableSpline(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsInWorld(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and UNIT_STATE_MOVING.

Referenced by npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), boss_alar::DoDiveBomb(), UtherBatteredHiltEvent::Execute(), WorldSession::HandlePetActionHelper(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_ulduar::instance_ulduar_InstanceMapScript::OnCreatureCreate(), boss_janalai::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), SetRooted(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), Creature::Update(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), and npc_vortex_ride::npc_vortex_rideAI::UpdateAI().

◆ Talk() [1/2]

void Unit::Talk ( std::string_view  text,
ChatMsg  msgType,
Language  language,
float  textRange,
WorldObject const *  target 
)
virtual
20992{
20993 Acore::CustomChatTextBuilder builder(this, msgType, text, language, target);
20996 Cell::VisitObjects(this, worker, textRange);
20997}
Definition: GridNotifiers.h:583
Definition: GridNotifiers.h:1738
Definition: ChatTextBuilder.h:49

References Cell::VisitObjects().

Referenced by spell_inoculate_nestlewood_owlkin::HandleEffectRemove(), and spell_the_flag_of_ownership::HandleScript().

◆ Talk() [2/2]

void Unit::Talk ( uint32  textId,
ChatMsg  msgType,
float  textRange,
WorldObject const *  target 
)
virtual
21044{
21045 if (!sObjectMgr->GetBroadcastText(textId))
21046 {
21047 LOG_ERROR("entities.unit", "Unit::Talk: `broadcast_text` (ID: {}) was not found", textId);
21048 return;
21049 }
21050
21051 Acore::BroadcastTextBuilder builder(this, msgType, textId, getGender(), target);
21054 Cell::VisitObjects(this, worker, textRange);
21055}
uint8 getGender() const
Definition: Unit.h:800
Definition: ChatTextBuilder.h:31

References getGender(), LOG_ERROR, sObjectMgr, and Cell::VisitObjects().

◆ TauntApply()

void Unit::TauntApply ( Unit victim)
14766{
14767 ASSERT(IsCreature());
14768
14769 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14770 return;
14771
14772 if (!CanHaveThreatList())
14773 return;
14774
14775 Creature* creature = ToCreature();
14776
14777 if (creature->HasReactState(REACT_PASSIVE))
14778 return;
14779
14780 Unit* target = GetVictim();
14781 if (target && target == taunter)
14782 return;
14783
14784 SetInFront(taunter);
14785 SetGuidValue(UNIT_FIELD_TARGET, taunter->GetGUID());
14786
14787 if (creature->IsAIEnabled)
14788 creature->AI()->AttackStart(taunter);
14789
14790 //m_ThreatMgr.tauntApply(taunter);
14791}
void SetInFront(WorldObject const *target)
Definition: Unit.cpp:20363

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), REACT_PASSIVE, Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and boss_razorgore::boss_razorgoreAI::OnCharmed().

◆ TauntFadeOut()

void Unit::TauntFadeOut ( Unit taunter)
14796{
14797 ASSERT(IsCreature());
14798
14799 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14800 return;
14801
14802 if (!CanHaveThreatList())
14803 return;
14804
14805 Creature* creature = ToCreature();
14806
14807 if (creature->HasReactState(REACT_PASSIVE))
14808 return;
14809
14810 Unit* target = GetVictim();
14811 if (!target || target != taunter)
14812 return;
14813
14815 {
14816 if (creature->IsAIEnabled)
14818 return;
14819 }
14820
14821 target = creature->SelectVictim(); // might have more taunt auras remaining
14822
14823 if (target && target != taunter)
14824 {
14826 SetInFront(target);
14827 if (creature->IsAIEnabled)
14828 creature->AI()->AttackStart(target);
14829 }
14830}
@ EVADE_REASON_NO_HOSTILES
Definition: CreatureAI.h:90
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
Definition: CreatureAI.cpp:215
bool isThreatListEmpty() const
Definition: ThreatMgr.h:224
Unit * SelectVictim()
Definition: Unit.cpp:14834

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), CreatureAI::EnterEvadeMode(), CreatureAI::EVADE_REASON_NO_HOSTILES, Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), ThreatMgr::isThreatListEmpty(), m_ThreatMgr, REACT_PASSIVE, Creature::SelectVictim(), Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ TextEmote() [1/2]

◆ TextEmote() [2/2]

void Unit::TextEmote ( uint32  textId,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
virtual

Reimplemented in Player.

21068{
21069 Talk(textId, isBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
21070}

References CHAT_MSG_MONSTER_EMOTE, CHAT_MSG_RAID_BOSS_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToPet()

◆ ToTempSummon() [1/2]

TempSummon * Unit::ToTempSummon ( )
inline
686{ if (IsSummon()) return reinterpret_cast<TempSummon*>(this); else return nullptr; }

References IsSummon().

Referenced by CreatureAI::_EnterEvadeMode(), _ExitVehicle(), npc_living_mojo::npc_living_mojoAI::AttackStart(), WorldObject::CanSeeOrDetect(), Spell::CheckCast(), Spell::CheckEffectTarget(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Creature::DespawnOnEvade(), Creature::DespawnOrUnsummon(), npc_bone_spike::npc_bone_spikeAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), ThreatMgr::DoAddThreat(), Spell::EffectScriptEffect(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), npc_raging_flames::FixateRandomTarget(), boss_headless_horseman_head::GetOwner(), GetSpellModOwner(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::GetSummoner(), CreatureAI::GetSummoner(), Creature::GetSummonerGUID(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pilgrims_bounty_pass_generic::HandleDummy(), WorldSession::HandlePetActionHelper(), spell_pri_lightwell::HandleScriptEffect(), spell_q11026_a11051_banish_the_demons::HandleScriptEffect(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), npc_pet_gen_imp_in_a_bottle::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), Creature::IsUpdateNeeded(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), npc_raging_spirit::npc_raging_spiritAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::JustDied(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::JustSummoned(), npc_frosthound::npc_frosthoundAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), npc_collapsing_star::npc_collapsing_starAI::JustSummoned(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::JustSummoned(), boss_supremus::JustSummoned(), Kill(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_netherspite_infernal::KilledUnit(), npc_living_mojo::npc_living_mojoAI::MoveInLineOfSight(), npc_jenny::MoveInLineOfSight(), WaypointMovementGenerator< Creature >::MovementInform(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::MovementInform(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_claw_tentacle::npc_claw_tentacle(), npc_eye_tentacle::npc_eye_tentacle(), npc_giant_claw_tentacle::npc_giant_claw_tentacle(), npc_giant_eye_tentacle::npc_giant_eye_tentacle(), npc_midsummer_bonfire::npc_midsummer_bonfire(), npc_midsummer_ribbon_pole_target::npc_midsummer_ribbon_pole_target(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), BattlefieldWG::OnCreatureCreate(), instance_blackwing_lair::instance_blackwing_lair_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), RemoveAllControlled(), RemoveAllMinionsByEntry(), spell_gen_defend::RemoveDummyFromDriver(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), npc_voidtraveler::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), Spell::SendSpellGo(), Spell::SendSpellStart(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_pilgrims_bounty_plate::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SummonedCreatureDies(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::Update(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_freya_ward::npc_freya_wardAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_captured_beryl_sorcerer::npc_captured_beryl_sorcererAI::UpdateAI(), npc_jenny::UpdateFollowerAI(), Player::VehicleSpellInitialize(), and npc_frosthound::npc_frosthoundAI::WaypointReached().

◆ ToTempSummon() [2/2]

const TempSummon * Unit::ToTempSummon ( ) const
inline
687{ if (IsSummon()) return reinterpret_cast<const TempSummon*>(this); else return nullptr; }

References IsSummon().

◆ ToTotem()

Totem * Unit::ToTotem ( )
inline
685{ if (IsTotem()) return reinterpret_cast<Totem*>(this); else return nullptr; }
Definition: Totem.h:51

References IsTotem().

Referenced by _UnapplyAura(), Spell::EffectDestroyAllTotems(), WorldSession::HandleTotemDestroyed(), SetMinion(), Spell::SummonGuardian(), and TotemAI::UpdateAI().

◆ TriggerAurasProcOnEvent() [1/3]

void Unit::TriggerAurasProcOnEvent ( CalcDamageInfo damageInfo)
16627{
16628 DamageInfo dmgInfo = DamageInfo(damageInfo);
16629 TriggerAurasProcOnEvent(nullptr, nullptr, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, 0, 0, damageInfo.procEx, nullptr, &dmgInfo, nullptr);
16630}
void TriggerAurasProcOnEvent(CalcDamageInfo &damageInfo)
Definition: Unit.cpp:16626

References CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::target, and TriggerAurasProcOnEvent().

Referenced by TriggerAurasProcOnEvent().

◆ TriggerAurasProcOnEvent() [2/3]

void Unit::TriggerAurasProcOnEvent ( ProcEventInfo eventInfo,
std::list< AuraApplication * > &  procAuras 
)
16652{
16653 for (std::list<AuraApplication*>::iterator itr = aurasTriggeringProc.begin(); itr != aurasTriggeringProc.end(); ++itr)
16654 {
16655 if (!(*itr)->GetRemoveMode())
16656 (*itr)->GetBase()->TriggerProcOnEvent(*itr, eventInfo);
16657 }
16658}

◆ TriggerAurasProcOnEvent() [3/3]

void Unit::TriggerAurasProcOnEvent ( std::list< AuraApplication * > *  myProcAuras,
std::list< AuraApplication * > *  targetProcAuras,
Unit actionTarget,
uint32  typeMaskActor,
uint32  typeMaskActionTarget,
uint32  spellTypeMask,
uint32  spellPhaseMask,
uint32  hitMask,
Spell spell,
DamageInfo damageInfo,
HealInfo healInfo 
)
16633{
16634 // prepare data for self trigger
16635 ProcEventInfo myProcEventInfo = ProcEventInfo(this, actionTarget, actionTarget, typeMaskActor, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16636 std::list<AuraApplication*> myAurasTriggeringProc;
16637 GetProcAurasTriggeredOnEvent(myAurasTriggeringProc, myProcAuras, myProcEventInfo);
16638
16639 // prepare data for target trigger
16640 ProcEventInfo targetProcEventInfo = ProcEventInfo(this, actionTarget, this, typeMaskActionTarget, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16641 std::list<AuraApplication*> targetAurasTriggeringProc;
16642 if (typeMaskActionTarget)
16643 GetProcAurasTriggeredOnEvent(targetAurasTriggeringProc, targetProcAuras, targetProcEventInfo);
16644
16645 TriggerAurasProcOnEvent(myProcEventInfo, myAurasTriggeringProc);
16646
16647 if (typeMaskActionTarget)
16648 TriggerAurasProcOnEvent(targetProcEventInfo, targetAurasTriggeringProc);
16649}
void GetProcAurasTriggeredOnEvent(std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
Definition: Unit.cpp:16596

References GetProcAurasTriggeredOnEvent(), and TriggerAurasProcOnEvent().

◆ UnsummonAllTotems()

void Unit::UnsummonAllTotems ( bool  onDeath = false)
11298{
11299 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
11300 {
11301 if (!m_SummonSlot[i])
11302 {
11303 continue;
11304 }
11305
11306 if (Creature* OldTotem = GetMap()->GetCreature(m_SummonSlot[i]))
11307 {
11308 if (OldTotem->IsSummon())
11309 {
11310 if (!(onDeath && !IsPlayer() && OldTotem->IsGuardian()))
11311 {
11312 OldTotem->ToTempSummon()->UnSummon();
11313 }
11314 }
11315 }
11316 }
11317}

References WorldObject::GetMap(), Object::IsPlayer(), m_SummonSlot, and MAX_SUMMON_SLOT.

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ Update()

void Unit::Update ( uint32  time)
overridevirtual

Reimplemented from WorldObject.

385{
386 sScriptMgr->OnUnitUpdate(this, p_time);
387
388 // WARNING! Order of execution here is important, do not change.
389 // Spells must be processed with event system BEFORE they go to _UpdateSpells.
390 // Or else we may have some SPELL_STATE_FINISHED spells stalled in pointers, that is bad.
391 WorldObject::Update(p_time);
392
393 if (!IsInWorld())
394 return;
395
396 // pussywizard:
397 if (!IsPlayer() || (!ToPlayer()->IsBeingTeleported() && !bRequestForcedVisibilityUpdate))
398 {
400 {
402 {
404 //ExecuteDelayedUnitRelocationEvent();
406 }
407 else
409 }
411 {
412 if (m_delayed_unit_ai_notify_timer <= p_time)
413 {
416 }
417 else
419 }
420 }
421
422 _UpdateSpells( p_time );
423
424 if (CanHaveThreatList() && GetThreatMgr().isNeedUpdateToClient(p_time))
426
427 // update combat timer only for players and pets (only pets with PetAI)
429 {
430 // Check UNIT_STATE_MELEE_ATTACKING or UNIT_STATE_CHASE (without UNIT_STATE_FOLLOW in this case) so pets can reach far away
431 // targets without stopping half way there and running off.
432 // These flags are reset after target dies or another command is given.
434 {
435 // m_CombatTimer set at aura start and it will be freeze until aura removing
436 if (m_CombatTimer <= p_time)
438 else
439 m_CombatTimer -= p_time;
440 }
441 }
442
445 {
446 while (!extraAttacksTargets.empty())
447 {
448 auto itr = extraAttacksTargets.begin();
449 ObjectGuid targetGuid = itr->first;
450 uint32 count = itr->second;
451 extraAttacksTargets.erase(itr);
452 if (Unit* victim = ObjectAccessor::GetUnit(*this, targetGuid))
453 {
455 || victim->IsWithinMeleeRange(this))
456 {
457 HandleProcExtraAttackFor(victim, count);
458 }
459 }
460 }
462 }
463
464 // not implemented before 3.0.2
465 // xinef: if attack time > 0, reduce by diff
466 // if on next update, attack time < 0 assume player didnt attack - set to 0
467 bool suspendAttackTimer = false;
468 bool suspendRangedAttackTimer = false;
470 {
471 for (Spell* spell : m_currentSpells)
472 {
473 if (spell)
474 {
475 if (spell->GetSpellInfo()->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
476 {
477 if (spell->IsChannelActive())
478 {
479 suspendRangedAttackTimer = true;
480 }
481
482 suspendAttackTimer = true;
483 break;
484 }
485 }
486 }
487 }
488
489 if (!suspendAttackTimer)
490 {
491 if (int32 base_attack = getAttackTimer(BASE_ATTACK))
492 {
493 setAttackTimer(BASE_ATTACK, base_attack > 0 ? base_attack - (int32) p_time : 0);
494 }
495
496 if (int32 off_attack = getAttackTimer(OFF_ATTACK))
497 {
498 setAttackTimer(OFF_ATTACK, off_attack > 0 ? off_attack - (int32) p_time : 0);
499 }
500 }
501
502 if (!suspendRangedAttackTimer)
503 {
504 if (int32 ranged_attack = getAttackTimer(RANGED_ATTACK))
505 {
506 setAttackTimer(RANGED_ATTACK, ranged_attack > 0 ? ranged_attack - (int32)p_time : 0);
507 }
508 }
509
510 // update abilities available only for fraction of time
511 UpdateReactives(p_time);
512
516
517 UpdateSplineMovement(p_time);
518 GetMotionMaster()->UpdateMotion(p_time);
519
521}
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition: SharedDefines.h:1326
bool IsEmpty() const
Definition: LinkedList.h:97
virtual void Update(uint32 diff)
Definition: Object.cpp:1051
void _UpdateSpells(uint32 time)
Definition: Unit.cpp:3878
void UpdateSplineMovement(uint32 t_diff)
Definition: Unit.cpp:577
void UpdateReactives(uint32 p_time)
Definition: Unit.cpp:17023
void ExecuteDelayedUnitAINotifyEvent()
Definition: Unit.cpp:20352
void HandleProcExtraAttackFor(Unit *victim, uint32 count)
Definition: Unit.cpp:2792
void SendThreatListUpdate()
Definition: Unit.cpp:19908
std::unordered_set< Unit * > i_objectsForDelayedVisibility
Definition: Map.h:236
void UpdateMotion(uint32 diff)
Definition: MotionMaster.cpp:104

References _lastDamagedTargetGuid, _lastExtraAttackSpell, _UpdateSpells(), AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, bRequestForcedVisibilityUpdate, CanHaveThreatList(), ClearInCombat(), ObjectGuid::Empty, ExecuteDelayedUnitAINotifyEvent(), extraAttacksTargets, WorldObject::FindMap(), getAttackTimer(), GetMotionMaster(), GetThreatMgr(), ObjectAccessor::GetUnit(), HandleProcExtraAttackFor(), HasUnitState(), HasUnitTypeMask(), HealthAbovePct(), HealthBelowPct(), Map::i_objectsForDelayedVisibility, InvalidateValuesUpdateCache(), IsAlive(), IsControlledByPlayer(), LinkedListHead::IsEmpty(), IsInCombat(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), m_CombatTimer, m_currentSpells, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_HostileRefMgr, ModifyAuraState(), OFF_ATTACK, RANGED_ATTACK, SendThreatListUpdate(), setAttackTimer(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_HACK_AND_SLASH, SPELL_SWORD_SPECIALIZATION, sScriptMgr, Object::ToPlayer(), UNIT_MASK_CONTROLLABLE_GUARDIAN, UNIT_STATE_CASTING, WorldObject::Update(), MotionMaster::UpdateMotion(), UpdateReactives(), and UpdateSplineMovement().

Referenced by Creature::Update(), and Player::Update().

◆ UpdateAllResistances()

void Unit::UpdateAllResistances ( )
virtual

◆ UpdateAllStats()

virtual bool Unit::UpdateAllStats ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

◆ UpdateArmor()

virtual void Unit::UpdateArmor ( )
pure virtual

◆ UpdateAttackPowerAndDamage()

virtual void Unit::UpdateAttackPowerAndDamage ( bool  ranged = false)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateAuraForGroup()

void Unit::UpdateAuraForGroup ( uint8  slot)
17253{
17254 if (slot >= MAX_AURAS) // slot not found, return
17255 return;
17256 if (Player* player = ToPlayer())
17257 {
17258 if (player->GetGroup())
17259 {
17260 player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_AURAS);
17261 player->SetAuraUpdateMaskForRaid(slot);
17262 }
17263 }
17264 else if (IsCreature() && IsPet())
17265 {
17266 Pet* pet = ((Pet*)this);
17267 if (pet->isControlled())
17268 {
17269 Unit* owner = GetOwner();
17270 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
17271 {
17273 pet->SetAuraUpdateMaskForRaid(slot);
17274 }
17275 }
17276 }
17277}
#define MAX_AURAS
Definition: SpellAuraDefines.h:21
@ GROUP_UPDATE_FLAG_PET_AURAS
Definition: Group.h:118
@ GROUP_UPDATE_FLAG_AURAS
Definition: Group.h:109
void SetAuraUpdateMaskForRaid(uint8 slot)
Definition: Pet.h:137

References Player::GetGroup(), GetOwner(), GROUP_UPDATE_FLAG_AURAS, GROUP_UPDATE_FLAG_PET_AURAS, Pet::isControlled(), Object::IsCreature(), IsPet(), Object::IsPlayer(), MAX_AURAS, Pet::SetAuraUpdateMaskForRaid(), Player::SetGroupUpdateFlag(), and Object::ToPlayer().

Referenced by RemoveVisibleAura(), and SetVisibleAura().

◆ UpdateCharmAI()

void Unit::UpdateCharmAI ( )
15872{
15873 if (IsPlayer())
15874 return;
15875
15876 if (i_disabledAI) // disabled AI must be primary AI
15877 {
15878 if (!IsCharmed())
15879 {
15880 delete i_AI;
15882 i_disabledAI = nullptr;
15883 }
15884 }
15885 else
15886 {
15887 if (IsCharmed())
15888 {
15890 if (isPossessed() || IsVehicle())
15891 i_AI = new PossessedAI(ToCreature());
15892 else
15893 i_AI = new PetAI(ToCreature());
15894 }
15895 }
15896}
Definition: PassiveAI.h:37
Definition: PetAI.h:47

References i_AI, i_disabledAI, IsCharmed(), Object::IsPlayer(), isPossessed(), IsVehicle(), and Object::ToCreature().

Referenced by Creature::Update().

◆ UpdateDamagePhysical()

void Unit::UpdateDamagePhysical ( WeaponAttackType  attType)
virtual

Reimplemented in Guardian, and Totem.

61{
62 float totalMin = 0.f;
63 float totalMax = 0.f;
64
65 float tmpMin, tmpMax;
66 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
67 {
68 CalculateMinMaxDamage(attType, false, true, tmpMin, tmpMax, i);
69 totalMin += tmpMin;
70 totalMax += tmpMax;
71 }
72
73 switch (attType)
74 {
75 case BASE_ATTACK:
76 default:
79 break;
80 case OFF_ATTACK:
83 break;
84 case RANGED_ATTACK:
87 break;
88 }
89}
void SetStatFloatValue(uint16 index, float value)
Definition: Object.cpp:779

References BASE_ATTACK, CalculateMinMaxDamage(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, Object::SetStatFloatValue(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, and UNIT_FIELD_MINRANGEDDAMAGE.

Referenced by Player::_ApplyAmmoBonuses(), Player::_ApplyWeaponDamage(), boss_twin_valkyrAI::boss_twin_valkyrAI(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleModAttackSpeed(), HandleStatModifier(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::npc_toc_enh_shamanAI(), Player::RemoveAmmo(), Creature::SetCanDualWield(), ScriptedAI::SetEquipmentSlots(), Creature::UpdateAttackPowerAndDamage(), and Player::UpdateAttackPowerAndDamage().

◆ UpdateHeight()

void Unit::UpdateHeight ( float  newZ)

Only server-side height update, does not broadcast to client.

19902{
19904 if (IsVehicle())
19906}
void RelocatePassengers()
Definition: Vehicle.cpp:514

References Position::GetPositionX(), Position::GetPositionY(), GetVehicleKit(), IsVehicle(), Position::Relocate(), and Vehicle::RelocatePassengers().

Referenced by npc_dancing_flames::npc_dancing_flamesAI::Reset(), and SetHover().

◆ UpdateInterruptMask()

void Unit::UpdateInterruptMask ( )
770{
771 m_interruptMask = 0;
772 for (AuraApplicationList::const_iterator i = m_interruptableAuras.begin(); i != m_interruptableAuras.end(); ++i)
773 m_interruptMask |= (*i)->GetBase()->GetSpellInfo()->AuraInterruptFlags;
774
776 if (spell->getState() == SPELL_STATE_CASTING)
777 m_interruptMask |= spell->m_spellInfo->ChannelInterruptFlags;
778}

References CURRENT_CHANNELED_SPELL, m_currentSpells, m_interruptableAuras, m_interruptMask, and SPELL_STATE_CASTING.

Referenced by _UnapplyAura(), Spell::finish(), and RemoveAurasWithInterruptFlags().

◆ UpdateMaxHealth()

virtual void Unit::UpdateMaxHealth ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateMaxPower()

virtual void Unit::UpdateMaxPower ( Powers  power)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateObjectVisibility()

◆ UpdateOrientation()

void Unit::UpdateOrientation ( float  orientation)

Only server-side orientation update, does not broadcast to client.

19894{
19895 SetOrientation(orientation);
19896 if (IsVehicle())
19898}

References GetVehicleKit(), IsVehicle(), Vehicle::RelocatePassengers(), and Position::SetOrientation().

Referenced by Spell::UpdateChanneledTargetList(), and UpdatePosition().

◆ UpdatePosition() [1/2]

bool Unit::UpdatePosition ( const Position pos,
bool  teleport = false 
)
inline

◆ UpdatePosition() [2/2]

bool Unit::UpdatePosition ( float  x,
float  y,
float  z,
float  ang,
bool  teleport = false 
)
virtual

Reimplemented in Player.

19856{
19857 if (!Acore::IsValidMapCoord(x, y, z, orientation))
19858 return false;
19859
19860 float old_orientation = GetOrientation();
19861 float current_z = GetPositionZ();
19862 bool turn = (old_orientation != orientation);
19863 bool relocated = (teleport || GetPositionX() != x || GetPositionY() != y || current_z != z);
19864
19865 if (!GetVehicle())
19866 {
19867 uint32 mask = 0;
19868 if (turn) mask |= AURA_INTERRUPT_FLAG_TURNING;
19869 if (relocated) mask |= AURA_INTERRUPT_FLAG_MOVE;
19870 if (mask)
19872 }
19873
19874 if (relocated)
19875 {
19876 if (IsPlayer())
19877 GetMap()->PlayerRelocation(ToPlayer(), x, y, z, orientation);
19878 else
19879 GetMap()->CreatureRelocation(ToCreature(), x, y, z, orientation);
19880 }
19881 else if (turn)
19882 {
19883 UpdateOrientation(orientation);
19884
19885 if (IsPlayer() && ToPlayer()->GetFarSightDistance())
19887 }
19888
19889 return (relocated || turn);
19890}
bool IsValidMapCoord(float c)
Definition: GridDefines.h:210
void UpdateOrientation(float orientation)
Only server-side orientation update, does not broadcast to client.
Definition: Unit.cpp:19893
void PlayerRelocation(Player *, float x, float y, float z, float o)
Definition: Map.cpp:782
void CreatureRelocation(Creature *creature, float x, float y, float z, float o)
Definition: Map.cpp:804

References AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, Map::CreatureRelocation(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetVehicle(), Object::IsPlayer(), Acore::IsValidMapCoord(), Map::PlayerRelocation(), RemoveAurasWithInterruptFlags(), Object::ToCreature(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdateOrientation().

Referenced by npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_taldaram::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleMoveRootAck(), WorldSession::HandleMoveUnRootAck(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), NearTeleportTo(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_escortAI::SetNextWaypoint(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), Player::UpdatePosition(), and UpdateSplinePosition().

◆ UpdateReactives()

void Unit::UpdateReactives ( uint32  p_time)
17024{
17025 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
17026 {
17027 ReactiveType reactive = ReactiveType(i);
17028
17029 if (!m_reactiveTimer[reactive])
17030 continue;
17031
17032 if (m_reactiveTimer[reactive] <= p_time)
17033 {
17034 m_reactiveTimer[reactive] = 0;
17035
17036 switch (reactive)
17037 {
17038 case REACTIVE_DEFENSE:
17041 break;
17045 break;
17046 case REACTIVE_OVERPOWER:
17048 {
17050 }
17051 break;
17053 if (IsHunterPet())
17055 break;
17056 default:
17057 break;
17058 }
17059 }
17060 else
17061 {
17062 m_reactiveTimer[reactive] -= p_time;
17063 }
17064 }
17065}
ReactiveType
Definition: Unit.h:594

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), IsHunterPet(), m_reactiveTimer, MAX_REACTIVE, ModifyAuraState(), REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, and REACTIVE_WOLVERINE_BITE.

Referenced by Update().

◆ UpdateResistances()

virtual void Unit::UpdateResistances ( uint32  school)
pure virtual

Implemented in Creature, Player, and Totem.

Referenced by HandleStatModifier(), and UpdateAllResistances().

◆ UpdateSpeed()

void Unit::UpdateSpeed ( UnitMoveType  mtype,
bool  forced 
)
Todo:
possible affect only on MOVE_RUN
14352{
14353 int32 main_speed_mod = 0;
14354 float stack_bonus = 1.0f;
14355 float non_stack_bonus = 1.0f;
14356
14357 switch (mtype)
14358 {
14359 // Only apply debuffs
14360 case MOVE_FLIGHT_BACK:
14361 case MOVE_RUN_BACK:
14362 case MOVE_SWIM_BACK:
14363 case MOVE_WALK:
14364 break;
14365 case MOVE_RUN:
14366 {
14367 if (IsMounted()) // Use on mount auras
14368 {
14372 }
14373 else
14374 {
14378 }
14379 break;
14380 }
14381 case MOVE_SWIM:
14382 {
14383 // xinef: check for forced_speed_mod of sea turtle
14385 for (Unit::AuraEffectList::const_iterator itr = swimAuras.begin(); itr != swimAuras.end(); ++itr)
14386 {
14387 // xinef: sea turtle only, it is not affected by any increasing / decreasing effects
14388 if ((*itr)->GetId() == 64731 /*SPELL_SEA_TURTLE*/)
14389 {
14390 SetSpeed(mtype, AddPct(non_stack_bonus, (*itr)->GetAmount()), forced);
14391 return;
14392 }
14393 else if (
14394 // case: increase speed
14395 ((*itr)->GetAmount() > 0 && (*itr)->GetAmount() > main_speed_mod) ||
14396 // case: decrease speed
14397 ((*itr)->GetAmount() < 0 && (*itr)->GetAmount() < main_speed_mod)
14398 )
14399 {
14400 main_speed_mod = (*itr)->GetAmount();
14401 }
14402 }
14403 break;
14404 }
14405 case MOVE_FLIGHT:
14406 {
14407 if (IsCreature() && IsControlledByPlayer()) // not sure if good for pet
14408 {
14411
14412 // for some spells this mod is applied on vehicle owner
14413 int32 owner_speed_mod = 0;
14414
14415 if (Unit* owner = GetCharmer())
14416 owner_speed_mod = owner->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED);
14417
14418 main_speed_mod = std::max(main_speed_mod, owner_speed_mod);
14419 }
14420 else if (IsMounted())
14421 {
14425 }
14426 else // Use not mount (shapeshift for example) auras (should stack)
14427 {
14431 }
14432
14433 // Update speed for vehicle if available
14434 if (IsPlayer() && GetVehicle())
14436 break;
14437 }
14438 default:
14439 LOG_ERROR("entities.unit", "Unit::UpdateSpeed: Unsupported move type ({})", mtype);
14440 return;
14441 }
14442
14443 // now we ready for speed calculation
14444 float speed = std::max(non_stack_bonus, stack_bonus);
14445 if (main_speed_mod)
14446 AddPct(speed, main_speed_mod);
14447
14448 switch (mtype)
14449 {
14450 case MOVE_RUN:
14451 case MOVE_SWIM:
14452 case MOVE_FLIGHT:
14453 {
14454 // Set creature speed rate
14455 if (IsCreature())
14456 {
14457 if (IsPet() && ToPet()->isControlled() && IsControlledByPlayer())
14458 {
14459 // contant value for player pets
14460 speed *= 1.15f;
14461 }
14462 else
14463 {
14464 speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
14465 }
14466 }
14467
14468 // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
14471 {
14472 if (Creature* creature = ToCreature())
14473 {
14474 uint32 immuneMask = creature->GetCreatureTemplate()->MechanicImmuneMask;
14475 if (immuneMask & (1 << (MECHANIC_SNARE - 1)) || immuneMask & (1 << (MECHANIC_DAZE - 1)))
14476 break;
14477 }
14478
14479 // Use speed from aura
14480 float max_speed = normalization / (IsControlledByPlayer() ? playerBaseMoveSpeed[mtype] : baseMoveSpeed[mtype]);
14481 if (speed > max_speed)
14482 speed = max_speed;
14483 }
14484 break;
14485 }
14486 default:
14487 break;
14488 }
14489
14490 int32 slowFromHealth = 0;
14491 Creature* creature = ToCreature();
14492 // ignore pets, player owned vehicles, and mobs immune to snare
14493 if (creature
14494 && !IsPet()
14495 && !(IsControlledByPlayer() && IsVehicle())
14497 && !(creature->IsDungeonBoss()))
14498 {
14499 // 1.6% for each % under 30.
14500 // use min(0, health-30) so that we don't boost mobs above 30.
14501 slowFromHealth = (int32) std::min(0.0f, (1.66f * (GetHealthPct() - 30.0f)));
14502 }
14503
14504 if (slowFromHealth)
14505 {
14506 AddPct(speed, slowFromHealth);
14507 }
14508
14509 // Apply strongest slow aura mod to speed
14511 if (slow)
14512 AddPct(speed, slow);
14513
14514 if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED))
14515 {
14516 float base_speed = (IsCreature() ? ToCreature()->GetCreatureTemplate()->speed_run : 1.0f);
14517 float min_speed = base_speed * (minSpeedMod / 100.0f);
14518 if (speed < min_speed)
14519 speed = min_speed;
14520 }
14521
14522 SetSpeed(mtype, speed, forced);
14523}
@ SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED
Definition: SpellAuraDefines.h:269
@ SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS
Definition: SpellAuraDefines.h:272
@ SPELL_AURA_MOD_INCREASE_SPEED
Definition: SpellAuraDefines.h:94
@ SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS
Definition: SpellAuraDefines.h:271
@ SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:235
@ SPELL_AURA_MOD_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:234
@ SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING
Definition: SpellAuraDefines.h:273
@ SPELL_AURA_MOD_INCREASE_SWIM_SPEED
Definition: SpellAuraDefines.h:121
@ SPELL_AURA_MOD_MINIMUM_SPEED
Definition: SpellAuraDefines.h:368
@ SPELL_AURA_MOD_SPEED_ALWAYS
Definition: SpellAuraDefines.h:192
@ SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING
Definition: SpellAuraDefines.h:274
@ SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS
Definition: SpellAuraDefines.h:193
@ SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED
Definition: SpellAuraDefines.h:254
@ MECHANIC_DAZE
Definition: SharedDefines.h:1363
float speed_run
Definition: CreatureData.h:201
void SetSpeed(UnitMoveType mtype, float rate, bool forced=false)
Definition: Unit.cpp:14530

References AddPct(), baseMoveSpeed, GetAuraEffectsByType(), GetCharmer(), Creature::GetCreatureTemplate(), GetHealthPct(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), GetTotalAuraModifier(), GetTotalAuraMultiplier(), GetVehicle(), GetVehicleBase(), Creature::HasMechanicTemplateImmunity(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsDungeonBoss(), IsMounted(), IsPet(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MECHANIC_DAZE, MECHANIC_SNARE, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_WALK, playerBaseMoveSpeed, SetSpeed(), CreatureTemplate::speed_run, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING, SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING, SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED, SPELL_AURA_MOD_INCREASE_SPEED, SPELL_AURA_MOD_INCREASE_SWIM_SPEED, SPELL_AURA_MOD_MINIMUM_SPEED, SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK, SPELL_AURA_MOD_SPEED_ALWAYS, SPELL_AURA_MOD_SPEED_NOT_STACK, SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED, Object::ToCreature(), ToPet(), and UpdateSpeed().

Referenced by Creature::DoFleeToGetAssistance(), AuraEffect::HandleAuraModDecreaseSpeed(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModIncreaseSpeed(), AuraEffect::HandleAuraModIncreaseSwimSpeed(), AuraEffect::HandleAuraModUseNormalSpeed(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), RemoveCharmedBy(), SetHealth(), SetInCombatState(), SetSpeed(), and UpdateSpeed().

◆ UpdateSplineMovement()

void Unit::UpdateSplineMovement ( uint32  t_diff)
private
578{
579 if (movespline->Finalized())
580 return;
581
582 // xinef: process movementinform
583 // this code cant be placed inside EscortMovementGenerator, because we cant delete active MoveGen while it is updated
584 SplineHandler handler(this);
585 movespline->updateState(t_diff, handler);
586 // Xinef: Spline was cleared by StopMoving, return
587 if (!movespline->Initialized())
588 {
590 return;
591 }
592
593 bool arrived = movespline->Finalized();
594
595 if (arrived)
596 {
598
599 if (movespline->HasAnimation() && IsCreature() && IsAlive())
601 }
602
603 // pussywizard: update always! not every 400ms, because movement generators need the actual position
604 //m_movesplineTimer.Update(t_diff);
605 //if (m_movesplineTimer.Passed() || arrived)
607}
@ UNIT_BYTES_1_OFFSET_ANIM_TIER
Definition: UnitDefines.h:26
Definition: Unit.cpp:557
uint8 GetAnimationType() const
Definition: MoveSpline.h:125
void updateState(int32 difftime, UpdateHandler &handler)
Definition: MoveSpline.h:98
bool HasAnimation() const
Definition: MoveSpline.h:124

References DisableSpline(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::GetAnimationType(), Movement::MoveSpline::HasAnimation(), Movement::MoveSpline::Initialized(), IsAlive(), Object::IsCreature(), movespline, Object::SetByteValue(), UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_FIELD_BYTES_1, UpdateSplinePosition(), and Movement::MoveSpline::updateState().

Referenced by Update().

◆ UpdateSplinePosition()

void Unit::UpdateSplinePosition ( )
private
610{
611 //static uint32 const positionUpdateDelay = 400;
612
613 //m_movesplineTimer.Reset(positionUpdateDelay);
615
617 {
619 pos.m_positionX = loc.x;
620 pos.m_positionY = loc.y;
621 pos.m_positionZ = loc.z;
623
624 if (TransportBase* transport = GetDirectTransport())
625 transport->CalculatePassengerPosition(loc.x, loc.y, loc.z, &loc.orientation);
626 }
627
628 // Xinef: if we had spline running update orientation along with position
629 //if (HasUnitState(UNIT_STATE_CANNOT_TURN))
630 // loc.orientation = GetOrientation();
631
632 if (IsPlayer())
633 UpdatePosition(loc.x, loc.y, loc.z, loc.orientation);
634 else
635 ToCreature()->SetPosition(loc.x, loc.y, loc.z, loc.orientation);
636}
void SetPosition(float x, float y, float z, float o)
Definition: Creature.cpp:3170
Position pos
Definition: Object.h:309
float m_positionZ
Definition: Position.h:57
float m_positionX
Definition: Position.h:55
float m_positionY
Definition: Position.h:56
TransportBase * GetDirectTransport() const
Definition: Unit.cpp:18864
Definition: VehicleDefines.h:130
Definition: MoveSpline.h:27
float orientation
Definition: MoveSpline.h:33
Location ComputePosition() const
Definition: MoveSpline.cpp:26
bool onTransport
Definition: MoveSpline.h:127

References Movement::MoveSpline::ComputePosition(), GetDirectTransport(), Object::IsPlayer(), WorldObject::m_movementInfo, Position::m_positionX, Position::m_positionY, Position::m_positionZ, movespline, Movement::MoveSpline::onTransport, Movement::Location::orientation, MovementInfo::TransportInfo::pos, Position::SetOrientation(), Creature::SetPosition(), Object::ToCreature(), MovementInfo::transport, and UpdatePosition().

Referenced by StopMoving(), and UpdateSplineMovement().

◆ UpdateStats()

virtual bool Unit::UpdateStats ( Stats  stat)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ Whisper() [1/2]

void Unit::Whisper ( std::string_view  text,
Language  language,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21015{
21016 if (!target)
21017 {
21018 return;
21019 }
21020
21022 WorldPacket data;
21023 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale);
21024 target->SendDirectMessage(&data);
21025}
@ CHAT_MSG_MONSTER_WHISPER
Definition: SharedDefines.h:3417
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition: SharedDefines.h:3444
LocaleConstant
Definition: Common.h:117
static std::size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition: Chat.cpp:265
LocaleConstant GetSessionDbLocaleIndex() const
Definition: WorldSession.h:547

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), and Player::SendDirectMessage().

Referenced by npc_commandscript::HandleNpcWhisperCommand(), spell_lich_king_whisper::HandleScript(), Map::ScriptsProcess(), and boss_zuramat::boss_zuramatAI::UpdateAI().

◆ Whisper() [2/2]

void Unit::Whisper ( uint32  textId,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21073{
21074 if (!target)
21075 {
21076 return;
21077 }
21078
21079 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
21080 if (!bct)
21081 {
21082 LOG_ERROR("entities.unit", "Unit::Whisper: `broadcast_text` was not {} found", textId);
21083 return;
21084 }
21085
21087 WorldPacket data;
21088 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
21089 target->SendDirectMessage(&data);
21090}
Definition: ObjectMgr.h:434
std::string const & GetText(LocaleConstant locale=DEFAULT_LOCALE, uint8 gender=GENDER_MALE, bool forceGender=false) const
Definition: ObjectMgr.h:456

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, getGender(), Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), BroadcastText::GetText(), LANG_UNIVERSAL, LOG_ERROR, Player::SendDirectMessage(), and sObjectMgr.

◆ Yell() [1/2]

void Unit::Yell ( std::string_view  text,
Language  language,
WorldObject const *  target = nullptr 
)
virtual

◆ Yell() [2/2]

void Unit::Yell ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21063{
21064 Talk(textId, CHAT_MSG_MONSTER_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
21065}

References CHAT_MSG_MONSTER_YELL, CONFIG_LISTEN_RANGE_YELL, and sWorld.

Member Data Documentation

◆ _charmThreatInfo

CharmThreatMap Unit::_charmThreatInfo
protected

Referenced by RemoveCharmedBy().

◆ _instantCast

bool Unit::_instantCast
protected

◆ _isWalkingBeforeCharm

bool Unit::_isWalkingBeforeCharm
private

Are we walking before we were charmed?

Referenced by SetCharm(), and Unit().

◆ _lastDamagedTargetGuid

◆ _lastExtraAttackSpell

uint32 Unit::_lastExtraAttackSpell
private

◆ _lastLiquid

LiquidTypeEntry const* Unit::_lastLiquid
protected

◆ _oldFactionId

uint32 Unit::_oldFactionId
private

faction before charm

Referenced by GetOldFactionId(), RemoveCharmedBy(), SetCharmedBy(), and Unit().

◆ _redirectThreatInfo

◆ _valuesUpdateCache

ValuesUpdateCache Unit::_valuesUpdateCache
private

◆ bRequestForcedVisibilityUpdate

◆ extraAttacksTargets

std::unordered_map<ObjectGuid , uint32 > Unit::extraAttacksTargets
private

Referenced by AddExtraAttacks(), and Update().

◆ i_AI

◆ i_disabledAI

UnitAI* Unit::i_disabledAI
protected

Referenced by UpdateCharmAI().

◆ i_motionMaster

MotionMaster* Unit::i_motionMaster
protected

Referenced by GetMotionMaster(), and ~Unit().

◆ IsAIEnabled

◆ m_appliedAuras

◆ m_applyResilience

bool Unit::m_applyResilience
protected

◆ m_attackers

◆ m_attacking

Unit* Unit::m_attacking
protected

◆ m_attackTimer

◆ m_auraModifiersGroup

◆ m_auraStateAuras

◆ m_auraUpdateIterator

AuraMap::iterator Unit::m_auraUpdateIterator
protected

◆ m_AutoRepeatFirstCast

bool Unit::m_AutoRepeatFirstCast
protected

◆ m_baseSpellCritChance

◆ m_canDualWield

bool Unit::m_canDualWield

◆ m_canModifyStats

bool Unit::m_canModifyStats
protected

◆ m_charmInfo

◆ m_cleanupDone

bool Unit::m_cleanupDone
private

◆ m_CombatTimer

uint32 Unit::m_CombatTimer
private

◆ m_ComboPointHolders

std::unordered_set<Unit*> Unit::m_ComboPointHolders
private

◆ m_comboPoints

int8 Unit::m_comboPoints
private

◆ m_comboTarget

◆ m_Controlled

◆ m_ControlledByPlayer

bool Unit::m_ControlledByPlayer

◆ m_CreatedByPlayer

bool Unit::m_CreatedByPlayer

◆ m_createStats

float Unit::m_createStats[MAX_STATS]
protected

◆ m_currentSpells

◆ m_deathState

◆ m_delayed_unit_ai_notify_timer

uint16 Unit::m_delayed_unit_ai_notify_timer

Referenced by Unit(), and Update().

◆ m_delayed_unit_relocation_timer

uint16 Unit::m_delayed_unit_relocation_timer

Referenced by Unit(), Player::Update(), and Update().

◆ m_Diminishing

◆ m_duringRemoveFromWorld

bool Unit::m_duringRemoveFromWorld
private

◆ m_dynObj

◆ m_extraAttacks

uint32 Unit::m_extraAttacks

◆ m_FollowingRefMgr

FollowerRefMgr Unit::m_FollowingRefMgr
private

Referenced by addFollower().

◆ m_gameObj

◆ m_HostileRefMgr

HostileRefMgr Unit::m_HostileRefMgr
private

◆ m_interruptableAuras

◆ m_interruptMask

◆ m_last_notify_mstime

uint32 Unit::m_last_notify_mstime

Referenced by Unit().

◆ m_last_notify_position

◆ m_lastManaUse

uint32 Unit::m_lastManaUse
private

◆ m_lastSanctuaryTime

uint32 Unit::m_lastSanctuaryTime

◆ m_modAttackSpeedPct

◆ m_modAuras

◆ m_modMeleeHitChance

◆ m_modRangedHitChance

◆ m_modSpellHitChance

◆ m_movedByPlayer

◆ m_ObjectSlot

◆ m_ownedAuras

◆ m_petAuras

PetAuraSet Unit::m_petAuras

◆ m_procDeep

int32 Unit::m_procDeep
protected

Referenced by CanProc(), and SetCantProc().

◆ m_race

uint8 Unit::m_race
protected

◆ m_reactiveTimer

uint32 Unit::m_reactiveTimer[MAX_REACTIVE]
protected

◆ m_realRace

uint8 Unit::m_realRace
protected

◆ m_regenTimer

◆ m_removedAuras

AuraList Unit::m_removedAuras
protected

◆ m_removedAurasCount

uint32 Unit::m_removedAurasCount
protected

◆ m_rootTimes

uint32 Unit::m_rootTimes
protected

Referenced by SetRooted(), and Unit().

◆ m_scAuras

AuraList Unit::m_scAuras
protected

Referenced by GetSingleCastAuras().

◆ m_sharedVision

◆ m_speed_rate

float Unit::m_speed_rate[MAX_MOVE_TYPE]
protected

◆ m_spellImmune

◆ m_state

uint32 Unit::m_state
private

◆ m_SummonSlot

◆ m_ThreatMgr

◆ m_threatModifier

float Unit::m_threatModifier[MAX_SPELL_SCHOOL]

◆ m_transform

uint32 Unit::m_transform
protected

Referenced by getTransForm(), setTransForm(), and Unit().

◆ m_unitTypeMask

◆ m_vehicle

◆ m_vehicleKit

Vehicle* Unit::m_vehicleKit
protected

◆ m_visibleAuras

◆ m_weaponDamage

◆ movespline

◆ NeedChangeAI

bool Unit::NeedChangeAI

◆ SafeUnitPointerSet

std::set<SafeUnitPointer*> Unit::SafeUnitPointerSet